洛谷 P1091 [NOIP2004 提高组] 合唱队形
这题的思路是动态规划。
找到每个数以该数为结尾的最长上升子序列长度和以该数为开始的最长下降子序列的长度。
其中求以该数为开始的最长下降子序列的长度可以看做从最后一个数开始往前数,以该数为结尾的最长上升子序列的长度。
求最长上升子序列长度。令f[j]=max(f[j],f[k]+1).(k<j,h[k]<h[j])即可。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; int n,h[105],maxn[105],minn[105],cnt; int main(){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&h[i]); for(int i=0;i<n;i++) maxn[i]=1,minn[i]=1; for(int i=0;i<n;i++) for(int j=0;j<i;j++){ if(h[i]>h[j]) maxn[i]=max(maxn[i],maxn[j]+1); } for(int i=n-1;i>=0;i--) for(int j=n-1;j>i;j--){ if(h[i]>h[j]) minn[i]=max(minn[i],minn[j]+1); } for(int i=0;i<n;i++) cnt=max(cnt,maxn[i]+minn[i]); printf("%d",n-cnt+1); return 0; }

浙公网安备 33010602011771号