代码随想录训练营第五十三天 | 动态规划
今天是代码随想录的第五十三天,今天依旧是子集问题
class Solution { public int longestCommonSubsequence(String text1, String text2) { int n = text1.length(); int m = text2.length(); int[][] dp = new int[n+1][m+1]; for(int i = 1 ; i<= n; i++){ char temp1 = text1.charAt(i-1); for(int j = 1; j<=m; j++){ char temp2 = text2.charAt(j-1); if(temp1 == temp2){ 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[n][m]; } }
dp[i][j]是dp[i][j]前一位的最大公共元素,每找到一位相同的,那么就可以加上1.
class Solution { public int maxUncrossedLines(int[] nums1, int[] nums2) { int n = nums1.length; int m = nums2.length; int[][] dp = new int[n+1][m+1]; for(int i = 1; i<=n; i++){ for(int j = 1; j<=m; 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[n][m]; } }
转化成最长子序列问题后,和上一题一样的思路
class Solution { public int maxSubArray(int[] nums) { int n = nums.length; int[] dp = new int[n]; dp[0] = nums[0]; for(int i = 1; i < n; i++){ if(nums[i-1]>0){ nums[i] += nums[i-1]; } dp[i] = Math.max(dp[i-1], nums[i]); } return dp[n-1]; } }
好像又回归到普通的dp了
刷题计划已经临近尾声!加油!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?