目录
题目链接:最长递增子序列
题目描述:
算法思路:
1.首先状态表示:dp[ i ]表示:以i位置为结尾,[0,i]区间内最长的递增子序列长度
2.根据子序列的特性:我们可以分析状态转移方程为两种情况:
(1):子序列长度为1时,此时我自己就可以构成子序列
(2):子序列长度大于1时:此时我可以和[0,(i-1) | | (i-2)……] 位置构成子序列,我们可以定义j为前面某个数的下标(0 <= j <= i-1), 我要和前面结合还必须要满足nums [j]<nums [i]。
当 j 满足条件时:我们的状态转移方程为:dp[i] = max(dp[j] + 1, dp[i])
3.初始化dp表:由于自己可以单独构成子序列,所以我们可以将dp表全部初始化为1,这样在我们填表的时候就不用处理单独一个数的情况了。
4.返回结果:根据状态表示,我们每填一次表都要求一下最大值,所以我们可以创建变量ret,每填一次表比较一次。
题目代码:
class Solution {
public int lengthOfLIS(int[] nums) {
int n = nums.length;
// 创建dp表
int[] dp = new int[n];
// 初始化dp表
Arrays.fill(dp, 1);
// ret来存储结果
int ret = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[j] + 1, dp[i]);
}
}
// 填一次比较一次
ret = Math.max(ret, dp[i]);
}
// 返回结果
return ret;
}
}