合唱队形(DP)
Posted ghostfly233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合唱队形(DP)相关的知识,希望对你有一定的参考价值。
这道题目就是裸的DP题,
我们所需要得到的是一个倒V形的数列
即一个上升子序列与下降子序列的合体。。
所以我们只需要做一遍从1到n的最长上升子序列和从n到1的最长上升子序列即可
时间复杂度O(n^2)
下面贴代码
#include<cstdio> #define MN 101 #define max(a,b) (a)>(b)?(a):(b) using namespace std; int num[MN],ss[MN],xj[MN]; int n,ans; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&num[i]); ss[1]=xj[n]=1; for(int i=2;i<=n;i++) { ss[i]=1; for(int j=1;j<i;j++) if(num[j]<num[i])ss[i]=max(ss[i],ss[j]+1); } for(int i=n-1;i>=1;i--) { xj[i]=1; for(int j=i+1;j<=n;j++) if(num[j]<num[i])xj[i]=max(xj[i],xj[j]+1); } for(int i=1;i<=n;i++)ans=max(ans,ss[i]+xj[i]-1); printf("%d\n",n-ans); return 0; }
以上是关于合唱队形(DP)的主要内容,如果未能解决你的问题,请参考以下文章