1. 程式人生 > >求陣列的最長遞減子序列

求陣列的最長遞減子序列

給定一個整數序列,輸出它的最長遞減(注意不是“不遞增”)子序列。

輸入包括兩行,第一行包括一個正整數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; }