动态规划 04

82 阅读1分钟

LeetCode 300

原题链接

代码如下:

/**
 * 
 * 动态规划
 * 
 * dp值得含义代表,以当前节点为末尾,前面构成的严格递增子数组的最大长度
 * 
 * 依次遍历数组,每次遍历,都重头开始遍历到i位置
 * 看是否满足严格递增,在这期间更新此次遍历的最大值tmpMax
 * 然后将tmpMax + 1(nums[i]自己本身) 赋值给此位置的dp
 * 最后再更新结果最大值ans
 * 
 * Code by java
 */

class Solution {
	public int lengthOfLIS(int[] nums) {
		int n = nums.length;
		if(n < 2) return n;
		
		int[] dp = new int[n];
		dp[0] = 1;
		int ans = dp[0];
		
		for (int i = 1; i < n; i++) {
			int tmpMax = 0;					//此次遍历的最大值,用于更新当前的dp值
			for (int j = 0; j < i; j++) {	//再从头到i,依次判断是否满足严格递增,再更新当前的最大值tmpMax
				if(nums[j] < nums[i]) {
					tmpMax = Math.max(tmpMax, dp[j]);
				}
			}
			dp[i] = tmpMax + 1;				//加1,就是加上当前遍历的nums[i]自己
			ans = Math.max(ans, dp[i]);
		}
		return ans;
	}
	
//	public static void main(String[] args) {
//		int[] a = new int[] {10,9,2,5,3,7,101,18};
//		Solution kk = new Solution();
//		System.out.println(kk.lengthOfLIS(a));
//	}
}