題目
描述
一個數的序列bi,當b1 < b2 < … < bS的時候,我們稱這個序列是上升的。對於給定的一個序列(a1, a2, …, aN),我們可以得到一些上升的子序列(ai1, ai2, …, aiK),這裏1 <= i1 < i2 < … < iK <= N。比如,對於序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。這些子序列中最長的長度是4,比如子序列(1, 3, 5, 8).
你的任務,就是對於給定的序列,求出最長上升子序列的長度。
輸入
輸入的第一行是序列的長度N (1 <= N <= 1000)。第二行給出序列中的N個整數,這些整數的取值範圍都在0到10000。
輸出
最長上升子序列的長度。
樣例輸入
7
1 7 3 5 9 4 8
樣例輸出
4
http://bailian.openjudge.cn/practice/2757/
思路
找到能遞推的子問題是解決動規的關鍵。第n項的最大長度是前n-1項中小於第n項的最大長度加一。而整體最大值是需要通過比較全部的n項的值才能得出。
#include <stdio.h>
#include <algorithm>
using namespace std;
int N,last[1005],n[1005];
int main()
{
//freopen("1.txt","r",stdin);
scanf("%d",&N);
last[0] =1;
for(int i=0;i<N;i++){
scanf("%d",&(n[i]));
}
for(int i=1;i<N;i++){
last[i] =1;
for(int j=i-1;j>=0;j--){
if(n[j]<n[i]){
last[i]=max(last[i],last[j]+1);
}
}
//printf("i=%d len=%d\n",i,last[i]);
}
int m = -1;
for(int i=0;i<N;i++){
m = max(m,last[i]);
}
printf("%d",m);
return 0;
}