您现在的位置是:首页 >技术教程 >代码随想录算法训练营第五十三天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和 动态规划网站首页技术教程
代码随想录算法训练营第五十三天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和 动态规划
简介代码随想录算法训练营第五十三天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和 动态规划
一、1143.最长公共子序列
- dp数组含义还是像上面的那样,便是0到i-1(包括i-1)的最长公共子序列
- 如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;
如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。
public int longestCommonSubsequence(String text1, String text2) {
int[][] dp = new int[text1.length()+1][text2.length()+1];
int max = 0;
for(int i=1;i<=text1.length();i++){
for(int j=1;j<=text2.length();j++){
if(text1.charAt(i-1)==text2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
} else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
max = Math.max(max,dp[i][j]);
}
}
return max;
}
11分钟
二、1035.不相交的线
- 看成是最长公共子序列
public int maxUncrossedLines(int[] nums1, int[] nums2) {
//最长公共子序列
int[][] dp = new int[nums1.length+1][nums2.length+1];
int max = 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;
} else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
max = Math.max(max,dp[i][j]);
}
}
return max;
}
10分钟
三、53. 最大子序和 动态规划
- dp表示以i为结尾的最大子数组和。这里只需要num.length的空间就可以
- 注意:
int result = 0;
来初始化是错的,应该使用第一个值来初始化result。int result = nums[0];
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];//以i为结尾的最大子数组和
dp[0] = nums[0];
for(int i=1;i<nums.length;i++){
dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);//继续加,重新开始
}
// return dp[nums.length-1];
// int result = 0;
int result = nums[0];
for(int i=0;i<dp.length;i++){
result = Math.max(result,dp[i]);
}
return result;
}
20分钟
总结
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。