小工具知识网

当前位置: 首页 > 行业知识 > 代码随想录算法训练营第53天| 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

行业知识

代码随想录算法训练营第53天| 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

2026-11-09 07:33:52 来源:互联网转载

1143.最长公共子序列

完���

()

思路:

定义二维dp数组,dp[i][j]代表以i-1结尾的text1和以j-1结尾的text2 的最长公共子序列长度,动态规划求子序列的相关问题中,dp数组这样定义是为了规避复杂的初始化,这是一个技巧。

代码

dp[i][j]代表以i结尾的text1和以j结尾的text2 的最长公共子序列长度

()
class Solution {    public int longestCommonSubsequence(String text1, String text2) {        // dp[i][j]代表以i结尾的text1和以j结尾的text2 的最长公共子序列长度        int[][] dp = new int[text1.length()][text2.length()];        // 初始化开始--------------------------------------------------        // 需要初始化最上行和最左列        // 前面的元素为0,后一个元素需要比较得到;前面的元素为1,后一个元素一定是1        dp[0][0] = text1.charAt(0) == text2.charAt(0)?1:0;        int flag = dp[0][0];        for (int i = 1; i  

dp[i][j]代表以i-1结尾的text1和以j-1结尾的text2 的最长公共子序列长度

class Solution {    public int longestCommonSubsequence(String text1, String text2) {        // dp[i][j]代表以i-1结尾的text1和以j-1结尾的text2 的最长公共子序列长度        int[][] dp = new int[text1.length()+1][text2.length()+1];        for (int i = 1; i             for (int j = 1; j             // 注意这里不是 i 和 j                if(text1.charAt(i-1)==text2.charAt(j-1)) dp[i][j] = Math.max(dp[i][j], dp[i-1][j-1]+1);                else dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);            }        }        return dp[text1.length()][text2.length()];    }}    public int maxUncrossedLines(int[] nums1, int[] nums2) {        int[][] dp = new int[nums1.length+1][nums2.length+1];        for (int i = 1; i             for (int j = 1; 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]);            }        }        return dp[nums1.length][nums2.length];    }}    public int maxSubArray(int[] nums) {        // dp[i]代表以i结尾的数组中 最大子数组和        int[] dp = new int[nums.length];        dp[0] = nums[0];        int res = nums[0];        for (int i = 1; i 

上一篇:怎么远程安装宝塔面板?

下一篇:怎么生成静态网站?