ACM PKU 2533 Longest Ordered Subsequence http://acm.pku.edu.cn/JudgeOnline/problem?id=2533
动态规划,最长递增子序列(不是非递减子序列);做法很简单,直接按照模板做就行了,主要是要想明白其中的道理,用什么存取加入第 i 个长度后当前的最长递增长度。两层循环,i 表示对第 i 个长度进行考察,j 表示对于 longer[i] 进行递增长度确定;写个状态转移方程就都明白了!
状态转移方程:
longer[i] = max{num[j]+1;其中1<j < i};
不知道对不对,总之就是这个意思吧!见笑了!!!
#include <iostream> using namespace std; int num[10001]; int longer[10001]; int longest; int more_longer = 1; int main () { int N; cin >> N; int i ,j; for ( i = 0;i < N;i++) scanf("%d", &num[i]); for (i = 1;i < N; i++) //核心代码开始,算法推敲从这里开始! { longest = 1; longer[0] = 1; for (j = 0;j < i; j++) { if (num[j] < num[i]) if (longest <= longer[j]+1) longest = longer[j] + 1; } //核心代码结束,相信没有什么问题;有问题留言; longer[i] = longest; if (more_longer < longest) more_longer = longest; } cout << more_longer << endl; return 0; }