目录
最长上升子序列:
一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。
O(N^2)动态规划:
状态:dp[i],表示以A[i]为结尾数组的的最长上升子序列长度
初始化:A[i]的最长上升子序列最小为1,也就是左边的数都大于等于A[i],最长上升子序列只有A[i]元素本身,dp[i] = 1;
dp[i]表示以A[i]的最长子序列长度,我们现在找倒数第二个元素。
遍历A[0,...i-1],设其中小于A[i]的元素为A[k,j,z...],倒数第二个元素必定在A[k,j,z]中,dp[i]有几种可能:
dp[i] = dp[k]+1;
dp[i ]= dp[j]+1;
dp[i] = dp[z]+1;
取这几种可能结果中的最大值,即为dp[i]的值。
最后返回的则是dp数组中的元素最大值。
class LongestIncreasingSubsequence {
public:
int getLIS(vector<int> A, int n) {
// write code here
//dp[i]为A[0...i]中的最长上升子序列的长度
int dp[501]= {0};
for(int i = 0;i<n;i++){