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

来源:互联网 发布:文件打开软件 编辑:程序博客网 时间:2024/05/18 15:29

描述:这是一个经典的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[n];        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;    }};


0 0
原创粉丝点击