计算最少出列多少位同学,使得剩下的同学排成合唱队形(C++)

来源:互联网 发布:ubuntu论坛 编辑:程序博客网 时间:2024/04/28 01:31
#include <iostream>using namespace std;const int maxn = 100 + 1;int main(){int n;int a[maxn];int f1[maxn];//存放合唱队的人数(从左向右)int f2[maxn];//存放合唱队的人数(从右向左)cin>>n;for(int i=1;i<=n;i++)//第0个位置不存放数据,符合平常的思维习惯。cin>>a[i];for(int i=1;i<=n;i++)//由左向右依次遍历{f1[i] = 1;//至少有一个人符合条件,就是他自己。所以赋初值1.for(int j=1;j<i;j++){if(a[i]>a[j]&&f1[i]<f1[j]+1) //f1[i]<f1[j]+1很关键的条件,动态问题f1[i]= f1[j]+1;}}for(int i=n;i>=1;i--)//由右向左依次遍历{f2[i] = 1;//至少有一个人符合条件,就是他自己。所以赋初值1.for (int j=i+1;j<=n;j++){if(a[i]>a[j]&&f2[i]<f2[j]+1)f2[i]=f2[j]+1;}}int ans = 0;for(int i=1;i<=n;i++)if(ans<f1[i]+f2[i]-1)ans=f1[i]+f2[i]-1;//最佳解cout<<n-ans<<endl;//需要出列的人数return 0;}
0 0