问题链接:ZOJ2136 Longest Ordered Subsequence
问题简述:参见上述问题描述。
大致思路:
首先要想到是动态规划问题。如何想到?你肯定要遍历,去找从开头到当前数的递增序列的数的个数,是取决于该递增序列在你前面那个(次大)数的最长递增序列的数的个数+1. 而且你想嘛,每个数对应一个个数值,应该是用数组来遍历的,这就更符合动态规划了。
然后你就想dp数组值表示的是啥?应该是所求——递增序列的数的个数(所求是最长,最后求个最大值即可)。
那么,dp选几维?一维。
dp下标表示啥?刚开始我想成表示元素的大小值了(因为想着去比较大小),后来在声明dp数组时觉得不对,突然发现其实dp下标应该表示给你的数组下标。
状态转移方程咋整?很简单,需要找到上一个比我小的数,然后把它的dp值+1.
关键部分bingo
#include
#include
#include
#include
#include
#include
#include
#include
备注:上面这个算法时间复杂度为O(n^2),而其实求最长上升子序列可以只要O(nlogn),内层用到二分法。
原理待搞懂。
参考链接:http://blog.csdn.net/tigerisland45/article/details/72850070