合唱队形
jzoj 1122
题目大意:
有n个人,按一定的顺序站成一排,最少减去多少个人可以使队列以一个人为中心,两边分别递减
输入样例
8
186 186 150 200 160 130 197 220
输出样例
4
数据范围
对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。
解题思路:
分别正着和逆着跑一遍最长上升子序列,然后找一个最优点加在一起即可
代码:
#include<cstdio>
#define max(x,y) (x)>(y)?(x):(y)
using namespace std;
int n,ans,a[150],l[150],r[150];
int main()
{scanf("%d",&n);for (int i=1;i<=n;++i){scanf("%d",&a[i]);l[i]=1;for (int j=1;j<i;++j)//正着if (a[j]<a[i])l[i]=max(l[i],l[j]+1);}for (int i=n;i>0;--i){r[i]=1;for (int j=n;j>i;--j)//倒着if (a[j]<a[i])r[i]=max(r[i],r[j]+1);}for (int i=1;i<=n;++i)//找一个中点ans=max(ans,l[i]+r[i]-1);printf("%d",n-ans);
}