10、LIS 和 LCS 问题
1、LIS 问题
更多问题
376 - 摆动序列
1.1、思路
1.2、图示
1.3、动态规划
public static int lengthOfLIS(int[] nums) { if (nums == null || nums.length == 0) return 0; if (nums.length == 1) return 1; // memo[i] = nums[0 ... i] 选择数字 nums[i] 可以获得的最长上升子序列的长度 int[] memo = new int[nums.length]; Arrays.fill(memo, 1); for (int i = 1; i < nums.length; i++) { // 求解 memo[i] for (int j = 0; j <= i - 1; j++) { if (nums[i] > nums[j]) memo[i] = Math.max(memo[i], 1 + memo[j]); } } return Arrays.stream(memo).max().getAsInt(); }
2、LCS 问题
2.1、思路
2.2、图示
2.3、记忆化搜索
public class Solution { private static int[][] memo; public static int longestCommonSubsequence(String text1, String text2) { if (text1 == null || text2 == null) return 0; int m = text1.length(); int n = text2.length(); memo = new int[m][n]; for (int[] arr : memo) Arrays.fill(arr, -1); return dp(text1.toCharArray(), text2.toCharArray(), m - 1, n - 1); } /** * s1[0 ... m] 和 s2[0 ... n] 的最长公共子序列 */ private static int dp(char[] s1, char[] s2, int m, int n) { if (m < 0 || n < 0) return 0; if (memo[m][n] != -1) return memo[m][n]; int res = -1; if (s1[m] == s2[n]) res = 1 + dp(s1, s2, m - 1, n - 1); else res = Math.max(dp(s1, s2, m - 1, n), dp(s1, s2, m, n - 1)); memo[m][n] = res; return res; } }
3、更多话题
3.1、单源最短路径算法
3.2、最长上升子序列的具体解
3.3、01 背包问题的具体解
本文来自博客园,作者:lidongdongdong~,转载请注明原文链接:https://www.cnblogs.com/lidong422339/p/17435739.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步