动态规划

DP入门 || 未完待续

2019-12-27  本文已影响0人  zilla

今天学一下逃避了一年的dp= = 以下内容整理自九章算法—dp入门

动态规划的类型

动态规划的组成部分

⚠️数组大小、计算顺序、初始化、转移

    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount+1];
        dp[0] = 0;
        int ntype = coins.length;
        for(int i = 1; i <= amount; i++) {
            dp[i] = Integer.MAX_VALUE;
            for(int j = 0; j < ntype; j++) {
                if(i>= coins[j] && dp[i - coins[j]]!= Integer.MAX_VALUE)
                dp[i] = Math.min(dp[i-coins[j]]+1, dp[i]);
            }
        }
        if(dp[amount] == Integer.MAX_VALUE)
            dp[amount] = -1;
        return dp[amount];
    }

LintCode114 Unique Paths

    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        dp[0][0] = 1;
        for(int i = 0; i < n; i++) 
            dp[0][i] = 1;
        for(int i = 0; i < m; i++)
            dp[i][0] = 1;
        // init其实可以放在for循环里
        for(int i = 1; i < m; i++) {
            for(int j = 1; j < n; j++) {
                dp[i][j] = dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }

LintCode116 Jump Game

    public boolean canJump(int[] A) {
        int nn = A.length;
        boolean[] dp = new boolean[nn];
        dp[0] = true;
        for(int i = 0; i < nn; i++) {
            for(int j = 0; j < i; j++) {
                if(dp[j] && j + A[j] >= i) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[nn-1];
    }

LeetCode152 乘积最大子序列

dp题目类型

时间、空间的优化
滚动数组
降维
打印路径

上一篇 下一篇

猜你喜欢

热点阅读