算法笔记|Day37动态规划X
- [☆☆☆☆☆leetcode 300.最长递增子序列](#☆☆☆☆☆leetcode 300.最长递增子序列)
- [☆☆☆☆☆leetcode 674. 最长连续递增序列](#☆☆☆☆☆leetcode 674. 最长连续递增序列)
- [☆☆☆☆☆leetcode 718. 最长重复子数组](#☆☆☆☆☆leetcode 718. 最长重复子数组)
☆☆☆☆☆leetcode 300.最长递增子序列
题目链接:leetcode 300.最长递增子序列
题目分析
1.dp数组含义:dpi表示i之前包括i的以numsi结尾的最长递增子序列的长度,取所有dpi中的最大值即为所求最长递增子序列的长度;
2.递推公式:if(numsi>numsj)dpi=Math.max(dpj+1,dpi)(如果遍历j从0到i-1,对所有满足numsi>numsj的j取dpj+1的最大值);
3.初始化:所有dpi=1(每一个i最长递增子序列大小至少都是1);
4.遍历顺序:从小到大。
代码
java
class Solution {
public int lengthOfLIS(int[] nums) {
int dp[]=new int[nums.length];
int res=1;
for(int i=0;i<nums.length;i++)
dp[i]=1;
for(int i=0;i<nums.length;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j])
dp[i]=Math.max(dp[j]+1,dp[i]);
res=Math.max(dp[i],res);
}
}
return res;
}
}
☆☆☆☆☆leetcode 674. 最长连续递增序列
题目分析
1.dp数组含义:dpi表示i之前包括i的以numsi结尾的最长递增子序列的长度,取所有dpi中的最大值即为所求最长连续递增序列的长度;
2.递推公式:if(numsi>numsi-1)dpi=dpi-1+1(如果numsi>numsi-1,则取dpi-1+1);
3.初始化:所有dpi=1(每一个i最长递增子序列大小至少都是1);
4.遍历顺序:从小到大。
代码
java
class Solution {
public int findLengthOfLCIS(int[] nums) {
int dp[]=new int[nums.length];
int res=1;
for(int i=0;i<nums.length;i++)
dp[i]=1;
for(int i=1;i<nums.length;i++){
if(nums[i]>nums[i-1])
dp[i]=dp[i-1]+1;
res=Math.max(dp[i],res);
}
return res;
}
}
☆☆☆☆☆leetcode 718. 最长重复子数组
题目分析
1.dp数组含义:dpij表示以nums1i-1和nums2j-1为结尾的最长重复子数组长度,取所有dpij中的最大值即为所求最长重复子数组的长度;
2.递推公式:if(nums1i-1==nums2j-1)dpij=dpi-1j-1+1(如果结尾元素相等,dpij在dpi-1j-1的基础上加一);
3.初始化:所有dpi0=0,所有dp0j=0;
4.遍历顺序:从小到大。
代码
java
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int dp[][]=new int[nums1.length+1][nums2.length+1];
int res=0;
for(int i=1;i<=nums1.length;i++){
for(int j=1;j<=nums2.length;j++){
if(nums1[i-1]==nums2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
res=Math.max(dp[i][j],res);
}
}
return res;
}
}