【POJ2533】最長順序サブシーケンス(LIS-最長昇順サブシーケンス/ DP)

最長順序のサブシーケンス

制限時間:2000MSメモリ制限:65536K

説明

a1 <a2 <…<aNの場合、aiの数値シーケンスが順序付けられます。与えられた数値シーケンス(a1、a2、…、aN)のサブシーケンスを任意のシーケンス(ai1、ai2、…、aiK)とします。ここで、1 <= i1 <i2 <…<iK <= Nです。たとえば、sequence( 1、7、3、5、9、4、8)は、(1、7)、(3、4、8)などのサブシーケンスを順序付けています。最も長い順序のサブシーケンスはすべて長さ4、たとえば(1、3、5、8)です。

プログラムは、数値シーケンスが与えられた場合、最も長い順序のサブシーケンスの長さを見つける必要があります。

入力

入力ファイルの最初の行には、シーケンスNの長さが含まれています。2行目には、シーケンスの要素が含まれています。それぞれ0から10000の範囲のN個の整数で、スペースで区切られています。1 <= N <= 1000

出力

出力ファイルには、単一の整数(指定されたシーケンスの最も長い順序のサブシーケンスの長さ)が含まれている必要があります。

サンプル入力

7
1 7 3 5 9 4 8

サンプル出力

4

トピックの主なアイデア:長さNのシーケンスがあることを示すためにNを入力し、次に最も長いシーケンスの長さを昇順で見つけます。

たとえば、1 7 3 5 9 48の最長シーケンスは13 5 9で、長さは4単位です。

dp []を使用してそこに到達する最長のシーケンスを記録する場合、dp [1] = 1であることがわかります。2番目の数値から始めて、2番目の数値が最初の数値num [2]> num [1]より大きい場合、dp [2] = dp [1] +1、それ以外の場合、dp [2] = dp [1]

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"

using namespace std;

const int maxn = 1e3+5;

int num[maxn];
int dp[maxn];
int n;
int temp;

int main(){
    while(~scanf("%d",&n)){
        for( int i=1 ; i<=n ; i++ ){
            scanf("%d",&num[i]);
        }
        dp[1]=1;
        for( int i=2 ; i<=n ; i++ ){
            temp = 0;
            for( int j=1 ; j<i ; j++ ){
                if(num[i]>num[j]){
                    if(temp<dp[j]){
                        temp = dp[j]; 
                    }
                }
            }
            dp[i] = temp + 1;
        }
        sort(dp+1,dp+n+1);
        printf("%d\n",dp[n]);
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/thesprit/article/details/52027170