最長順序のサブシーケンス
制限時間: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;
}