leetcode 300: 给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

数组用a[n]表示,最长子序列的长度用dp[n]来表示,即数组从0-i元素时,最长子序列的长度。

1.先不考虑上升,子序列有很多个,像[10]、[10,9,2]、[10,9,2,5,3,7]等所有排列组合个

2.保证值是上升的话,即当i>j,a[i]>a[j]时,dp[i]的值最大,也即子序列有a[i]这个元素时的dp[i]值最大;也即dp[i]=max{dp[1], dp[2], dp[3]....dp[j]}+1

......

层层递推,最终递推到dp[1]和dp[0],而这些初始状态是已知的。

代码部分

 1 public static int lengthOfLIS(int[] nums) {
 2         if(nums == null || nums.length==0){
 3             return 0;
 4         }
 5         int[] dp = new int[nums.length+1];
 6         for(int i=0;i<nums.length;i++) {
 7             dp[i] = 1;
 8         }
 9         int maxLength = 1;
10         for(int i=1;i< nums.length;i++) {
11             for(int j=0;j<i;j++) {
12                 if(nums[j]<nums[i]){
13                     dp[i] = Math.max(dp[i], dp[j]+1);
14                 }
15             }
16             maxLength = Math.max(maxLength, dp[i]);
17         }
18         System.out.println("最长上升子序列的长度:"+maxLength);
19         return maxLength;
20     }
java