专栏文章

合唱队形

P1091题解参与者 1已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miq7e5ob
此快照首次捕获于
2025/12/04 00:10
3 个月前
此快照最后确认于
2025/12/04 00:10
3 个月前
查看原文
有一个跟这个很像的题是 CF739C,有兴趣的可以去做一做。
在这里定义 fif_{i} 表示为以 ii 结尾的最长上升子序列个数,gig_i 表示为以 ii 开始的最长下降子序列个数,则显然当 fi+gif_i+g_i 最大时 ii 为两者转接点。
此时考虑状态转移方程,即 fi=maxaj<ai,j<ifj+1,gi=maxaj<ai,j>igj+1f_i=\max_{a_j<a_i,j<i}f_j+1,g_i=\max_{a_j<a_i,j>i}g_j+1。此时算出后答案为 maxi=1nnfigi+1\max_{i=1}^n n-f_i-g_i+1

code

CPP
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define lx first
#define ly second
const int maxn=1e2+10;
int n,a[maxn];
int f[maxn],ans=INT_MAX;
signed main(){
//	freopen("T2.in","r",stdin);
//	freopen("T2.out","w",stdout);
	cin >> n;for(int i=1;i<=n;++i)cin >> a[i];
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j)f[j]=1;
		for(int j=1;j<=i;++j){
			for(int k=1;k<j;++k){
				if(a[k]<a[j])f[j]=max(f[j],f[k]+1);
			}
		}
		int cnt1=f[i];
		for(int j=1;j<=n;++j)f[j]=1;
		for(int j=n;j>=i;--j){
			for(int k=n;k>j;--k){
				if(a[k]<a[j])f[j]=max(f[j],f[k]+1);
			}
		}
		cnt1+=f[i]-1;ans=min(ans,n-cnt1);
	}
	cout << ans << endl;
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...