本文主要是介绍代码随想录算法训练营29期|day57 任务以及具体安排,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第九章 动态规划part14
- 1143.最长公共子序列
/*二维dp数组 */ class Solution {public int longestCommonSubsequence(String text1, String text2) {// char[] char1 = text1.toCharArray();// char[] char2 = text2.toCharArray();// 可以在一開始的時候就先把text1, text2 轉成char[],之後就不需要有這麼多爲了處理字串的調整// 就可以和卡哥的code更一致int[][] dp = new int[text1.length() + 1][text2.length() + 1]; // 先对dp数组做初始化操作for (int i = 1 ; i <= text1.length() ; i++) {char char1 = text1.charAt(i - 1);for (int j = 1; j <= text2.length(); j++) {char char2 = text2.charAt(j - 1);if (char1 == char2) { // 开始列出状态转移方程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()];} }
思路:该题的dp数组表示0到i-1,j-1的最长公共子序列,递推公式:如果char1和char2相等的话,就在dp[i-1][j-1]的基础上+1,不相等的话就取相邻的最大值。
- 1035.不相交的线
class Solution {public int maxUncrossedLines(int[] nums1, int[] nums2) {int len1 = nums1.length;int len2 = nums2.length;int[][] dp = new int[len1 + 1][len2 + 1];for (int i = 1; i <= len1; i++) {for (int j = 1; j <= len2; 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[len1][len2];} }
思路:该题和上题的解法一模一样。
- 53. 最大子序和 动态规划
/*** 1.dp[i]代表当前下标对应的最大值* 2.递推公式 dp[i] = max (dp[i-1]+nums[i],nums[i]) res = max(res,dp[i])* 3.初始化 都为 0* 4.遍历方向,从前往后* 5.举例推导结果。。。** @param nums* @return*/public static int maxSubArray(int[] nums) {if (nums.length == 0) {return 0;}int res = nums[0];int[] dp = new int[nums.length];dp[0] = nums[0];for (int i = 1; i < nums.length; i++) {dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);res = res > dp[i] ? res : dp[i];}return res;}
思路:该题较为简单,类似于递增连续子序列,明确dp数组表示以nums[i]结尾的最大自序和,递推公式也很简单,就是要求加上nums[i]和nums[i]自身的最大值。
这篇关于代码随想录算法训练营29期|day57 任务以及具体安排的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!