1000ms 65536K給定一個整數序列,輸出它的最長遞減(注意不是“不遞增”)子序列。
輸入包括兩行,第一行包括一個正整數N(N<=1000),表示輸入的整數序列的長度。第二行包括用空格分隔開的N個整數,整數範圍區間爲[-30000,30000]。
輸出爲一行,最長遞減子序列的結果,數字間用空格分隔(測試case中只會有一個最長遞減子序列)。
樣例輸入
8 9 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;
}