求数组的最长递减子序列 (dp)

来源:互联网 发布:国内php框架排行 编辑:程序博客网 时间:2024/05/16 15:29
  •  1000ms
  •  65536K

给定一个整数序列,输出它的最长递减(注意不是“不递增”)子序列。

输入包括两行,第一行包括一个正整数N(N<=1000),表示输入的整数序列的长度。第二行包括用空格分隔开的N个整数,整数范围区间为[-30000,30000]。

输出为一行,最长递减子序列的结果,数字间用空格分隔(测试case中只会有一个最长递减子序列)。

样例输入

89 4 3 2 5 4 3 2

样例输出

9 5 4 3 2
#include<iostream>#include<string.h>using namespace std;int dp[1002][1002];int main(){    int n,a[1002],i,j,max,maxe;    while(cin>>n)    {        for(i=1;i<=n;i++)        {            cin>>a[i];            dp[i][0]=0;        }        dp[n+1][0]=0;dp[0][0]=0;a[0]=99999;        for(i=n;i>=0;i--)        {max=0;maxe=n+1;            for(j=i+1;j<=n+1;j++)            {                if(max<dp[j][0]&&a[i]>dp[j][dp[j][0]])                {                    max=dp[j][0];                    maxe=j;                }            }            dp[i][0]=dp[maxe][0]+1;            for(j=1;j<=max;j++)            {                dp[i][j]=dp[maxe][j];            }            dp[i][max+1]=a[i];        }        for(i=max;i>0;i--)        {            cout<<dp[0][i];            if(i!=1)            cout<<" ";            else            cout<<endl;        }    }    return 0;}


阅读全文
0 0
原创粉丝点击