動態規劃法經典例題

/**
 * 動態規劃法求解在矩陣中行走的最短路徑問題
 *有一個矩陣,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。
 * 給定一個矩陣返回最小路徑和。
 * 測試樣例:
 * [[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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章