您的位置:首页 > 其它

动态规划-最长递增子序列

2018-02-27 22:33 155 查看

题目描述

这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法求出序列的最长上升子序列的长度。
给定一个序列A及它的长度n,请返回LIS的长度。


求解过程

给定一个数组A,以及他的长度N
生成长度为N的数组dp
dp[i]的含义为:必须以A[i]结尾时的最长递增子序列的长度.

显然 dp[0]=1;

对于i 为1-N-1时, dp[i]为比A[i]小的数结尾的最长的子序列的长度+1

状态转移方程为
dp[i] = max{dp[j]+1|0<=j<i,A[j]<A[i]};


代码实现

class LongestIncreasingSubsequence
{
public:
int getLIS(vector<int> A, int n)
{
if(!n)
return 0;
int *dp = new int
;
dp[0]=1;
int maxlongs = 1;
for (int i=1; i<n; ++i)
{
int maxlen = 0;
for (int j=i-1; j>=0; --j)
{
if(A[j]<A[i])
maxlen = max(maxlen,dp[j]);
}
dp[i] = maxlen +1;
maxlongs = max(dp[i],maxlongs);
}
return maxlongs;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: