动态规划模版

时间:2020-05-12 12:44:06   收藏:0   阅读:57

1.遍历模版

public class Traversing {

    public void print1(int n) {

        System.out.println("按斜对角线从中间向右上打印矩阵");
        for (int j = n; j > 0; j--) {
            for (int i = 0; i < j; i++) {
                System.out.print("(" + i + "," + (n - j + i) + ") ");
            }
            System.out.println();
        }
    }

    public void print2(int n){
        System.out.println("按列递增的自底向上打印");
        for (int j = 0; j < n; j++) {
            for (int i = j; i > -1; i--) {
                System.out.print("(" + i + "," + j + ") ");
            }
            System.out.println();
        }
    }

    public void print3(int n){
        System.out.println("按行递减从左到右打印");
        for (int i = n-1; i >= 0; i--) {
            for (int j = i; j < n; j++) {
                System.out.print("(" + i + "," + j + ") ");

            }
            System.out.println();
        }
    }

    public static void main(String[] args) {

        Traversing traversing = new Traversing();
        System.out.println("都可以处理dp[i][j]由{dp[i+1][j-1](左下),dp[i][j-1](左),dp[i+1][j](下)}三个方向决定");
        traversing.print1(5);
        traversing.print2(5);
        traversing.print3(5);

    }

}

2.典型例题

(1)使用最少硬币数的K钱(O(KN))

技术分享图片

 (2)最长递增子序列(动态规划:O(N2),二分查找:O(NlogN))

技术分享图片

 (3)最长回文子序列长度(动态规划:O(N2) ,存在更优算法)

技术分享图片

 (4)最小编辑距离(动态规划:O(N2))

技术分享图片

int minDistance(String s1, String s2) {
    int m = s1.length(), n = s2.length();
    int[][] dp = new int[m + 1][n + 1];
    // base case
    for (int i = 1; i <= m; i++)
        dp[i][0] = i;
    for (int j = 1; j <= n; j++)
        dp[0][j] = j;
    // ?底向上求解
    for (int i = 1; i <= m; i++)
        for (int j = 1; j <= n; j++)
            if (s1.charAt(i-1) == s2.charAt(j-1))
                dp[i][j] = dp[i - 1][j - 1];
            else
                dp[i][j] = min(
                        dp[i - 1][j] + 1,
                        dp[i][j - 1] + 1,
                        dp[i-1][j-1] + 1
                );
    // 储存着整个 s1 和 s2 的最?编辑距离
    return dp[m][n];
} 
int min(int a, int b, int c) {
    return Math.min(a, Math.min(b, c));
}

 

原文:https://www.cnblogs.com/zhihaospace/p/12875303.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!