/** * 動態規劃法求解在矩陣中行走的最短路徑問題 *有一個矩陣,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。 * 給定一個矩陣返回最小路徑和。 * 測試樣例: * [[1,2,3],[1,1,1]],2,3 * 返回:4 * @param a 矩陣 * @return 返回最短路徑長度 */ public static int shortPath(int[][] a) { int minPath = 0; int[][] b = new int[a.length][a[0].length]; b[0][0] = a[0][0]; //計算出b矩陣的第一列的值 for (int i = 1; i < a.length; i++) { b[i][0] = a[i][0] + b[i - 1][0]; } //計算出b矩陣的第一行的值 for (int j = 1; j < a[0].length; j++) { b[0][j] = a[0][j] + b[0][j]; } //計算矩陣剩餘元素值 for (int i = 1; i < a.length; i++) { for (int j = 1; j < a[0].length; j++) { b[i][j] = a[i][j] + Math.min(b[i - 1][j], b[i][j - 1]); } } minPath = b[a.length - 1][a[0].length - 1]; return minPath; } /** * 走臺階問題(動態規劃法) * 有n級臺階,一個人每次上一級或者兩級,問有多少種走完n級臺階的方法 * @param n 臺階數 * @return */ public static int stepWay(int n) { int current = 0; int num1 = 1 % 1000000007; int num2= 2 % 1000000007; for (int i = 3; i < n + 1; i++) { current = (num1 + num2) % 1000000007; num1 = num2; num2 = current; } return num2; } /** * 最長公共序列數(動態規劃法) * 給定兩個字符串A和B,返回兩個字符串的最長公共子序列的長度。例如,A="1A2C3D4B56”,B="B1D23CA45B6A”,”123456"或者"12C4B6"都是最長公共子序列。 * 給定兩個字符串A和B,同時給定兩個串的長度n和m,請返回最長公共子序列的長度。保證兩串長度均小於等於300。 * 測試樣例: * "1A2C3D4B56",10,"B1D23CA45B6A",12 * 返回:6 * @param a 字符串a * @param n 字符串a的字符數 * @param b 字符串b * @param m 字符串b的字符數 * @return 最長公共序列字符的數量 */ public static int maxSubString(String a, int n, String b, int m){ int maxNum = 0; int[][] matrix = new int[n][m]; for (int i = 0; i < n; i++){ if (a.charAt(i) == b.charAt(0)) { matrix[i][0] = 1; for (i = i + 1; i < n; i++) { matrix[i][0] = 1; } break; } } for (int j = 0; j < m; j++){ if (b.charAt(j) == a.charAt(0)){ matrix[0][j] = 1; for (j = j + 1; j < n; j++) { matrix[j][0] = 1; } break; } } for (int i = 1; i < n; i++){ for (int j = 1; j < m; j++){ if (a.charAt(i) == b.charAt(j)){ matrix[i][j] = Math.max(Math.max(matrix[i-1][j-1]+1,matrix[i-1][j]),matrix[i][j-1]); }else { matrix[i][j] = Math.max(matrix[i-1][j],matrix[i][j-1]); } } } maxNum = matrix[n-1][m-1]; return maxNum; }
動態規劃法經典例題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.