LeetCode #300 最长上升子序列

https://leetcode-cn.com/problems/longest-increasing-subsequence/

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4

动态规划:

定义求解问题:我们可以将dp[i]定义为:在输入数组num[i]时能够找到的最长上升子序列的长度;
状态转移方程:转态转移就是根据子问题导出当前问题的状态。假设我们现在搜索到dp[i],我们可以通过寻找num[0]~num[i-1]中比num[i]要小的数字。假如找到了num[k1]、num[k2]....、num[kn]符合条件。那么dp[i] = max(dp[k],dp[k1],...dp[kn])+1;
边界条件:由于我们是从num[0]开始往后递推的,因此初始边界只需要把dp[0] = 1即可。

实现:

#define max(a,b) (a>b?a:b)
int lengthOfLIS(int* nums, int numsSize){
    if(numsSize==0||nums==NULL)
        return 0;
    int *dp = (int*)malloc(sizeof(int)*numsSize);
    int res = 1;
    dp[0] = 1;
    for(int i = 0; i < numsSize; ++i) {
        dp[i] = 1;
        for (int j = 0; j < i; ++j)
            if (nums[j] < nums[i]) 
                dp[i] = max(dp[i], dp[j] + 1);
        res = max(res,dp[i]);
    }
    return res;
}

 

你可能感兴趣的:(算法)