当前位置: 代码迷 >> 综合 >> poj 2757:最长上升子序列 动规
  详细解决方案

poj 2757:最长上升子序列 动规

热度:79   发布时间:2023-12-18 07:05:11.0

题目

描述
一个数的序列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;
}