动态规划----最大上升子序列

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

示例:

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

我刚开始的想法是用数组存答案,即前三个数的最长上升长度是多少,前四个是多少……但是被打脸了。

看来答案,一个思路是用数组temp【K】存以K结尾的最大上升长度,最后遍历数组,查找最大的上升长度。

class Solution {
    public int lengthOfLIS(int[] nums) {
        if(nums.length==0)
            return 0;
        int len=nums.length,i,j,ans[]=new int[len];
        ans[0]=1;
        for(i=1;i<len;i++) {
        	ans[i]=1;
        	for(j=0;j<i;j++) {
        		if(nums[i]>nums[j])
        			ans[i]=Math.max(ans[i], ans[j]+1);//以nums[i]结尾的最大上升长度
        	}
        }
        int t=1;
        for(i=1;i<len;i++)
        	if(ans[i]>t)
        		t=ans[i];
        return t;
    }
}

这一题给我的启示就是我之前对于DP的狭义认识就是用DP存答案,但是这是把DP作为一种中间工具,最后找到答案。

猜你喜欢

转载自blog.csdn.net/cobracanary/article/details/88626448