求陣列的最長遞減子序列
阿新 • • 發佈:2019-01-28
給定一個整數序列,輸出它的最長遞減(注意不是“不遞增”)子序列。
輸入包括兩行,第一行包括一個正整數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;
}