您的位置:首页 > 其它

求数组的最长递减子序列

2017-04-27 13:04 645 查看
给定一个整数序列,输出它的最长递减(注意不是“不递增”)子序列。

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

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

样例输入

8

9 4 3 2 5 4 3 2

样例输出

9 5 4 3 2

经典的dp问题,算法复杂度n^2,难点在打印路径上,使用递归打印比较方便

#include"iostream"
#include"vector"
#include"string.h"
using namespace std;
int roud[10010];
int ai[10010];
int mmax=0;

void print(int x)
{
if(x)
{
print(roud[x]);
if(x!=mmax)     cout<<ai[x]<<" ";
else  cout<<ai[x]<<endl;
}
}

int main()
{
int n;
int dp[10010];

memset(dp,0,sizeof(dp));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>ai[i];
}
for(int i=1;i<=n;i++)
{
dp[i]=1;
roud[i]=0;
for(int j=1;j<i;j++)
{
if(ai[i]<ai[j]&&dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
roud[i]=j;
}
}
if(dp[i]>dp[mmax])
{
mmax=i;
}
}
print(mmax);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐