动态规划法经典例题

/**
 * 动态规划法求解在矩阵中行走的最短路径问题
 *有一个矩阵,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。
 * 给定一个矩阵返回最小路径和。
 * 测试样例:
 * [[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;
}

你可能感兴趣的:(动态规划法经典例题)