暑假-动态规划 III-(Q - Alignment)

来源:互联网 发布:用什么软件下载电视剧 编辑:程序博客网 时间:2024/06/08 06:21
/*题意:令到原队列的最少士兵出列后,使得新队列任意一个士兵都能看到      左边或者右边的无穷远处。就是使新队列呈三角形分布就对了。思路:求2次dp,分别为第i个人为终点的最长上升子序列长度      第i个人为起点的最长下降子序列长度。注意:没必要特别去考虑中间等高的情况*/#include<iostream>using namespace std;const int MAXN=1005;double a[MAXN];//保存身高int updp[MAXN],downdp[MAXN];//up:表示以第i个人为终点的最长上升子序列长度//down:表示以第i个人为起点的最长下降子序列长度void dpup(int n){memset(updp,0,sizeof(updp));for(int i=1;i<=n;i++)//以第i个人为终点的最长上升子序列长度{                    //(顺序)int temp=0;for(int j=1;j<=i;j++){if(a[i]>a[j]){temp=temp>updp[j]?temp:updp[j];}}updp[i]=temp+1;}}void dpdown(int n){memset(downdp,0,sizeof(downdp));for(int i=n;i>0;i--)//以第i个人为起点的最长下降子序列长度{                   //逆序int temp=0;for(int j=i;j<=n;j++){if(a[i]>a[j]){temp=temp>downdp[j]?temp:downdp[j];}}downdp[i]=temp+1;}}int main(){int n;while(cin>>n){for(int i=1;i<=n;i++){cin>>a[i];}int ans=0;dpup(n);dpdown(n);for(int i=1;i<=n;i++)//循环上升序列{for(int j=i+1;j<=n;j++)//循环下降序列{if(updp[i]+downdp[j]>ans)//第i个人为终点的最长上升+{                        //i之后的人的最长下降ans=updp[i]+downdp[j];}}}cout<<n-ans<<endl;}return 0;}

0 0
原创粉丝点击