求數組的最長遞減子序列 (dp)

 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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章