動態規劃-禮物的最大價值

題目描述

在一個 m*n 的棋盤的每一個格都放有一個禮物,每個禮物都有一定價值(大於 0)。從左上角開始拿禮物,每次向右或向下移動一格,直到右下角結束。給定一個棋盤,求拿到禮物的最大價值。例如,對於如下棋盤

Solution

動態規劃,一維dp,計算當前值dp[i]所需的左值和上值分別保存爲dp[i-1]和dp[i]

public class Bonus {
    public int getMost(int[][] board) {
        // write code here
        int m = board.length;
        int n = board[0].length;
        int[] dp = new int[n];
        for (int i = 0; i < m; i++) {
            dp[0] += board[i][0];
            for (int j = 1; j < n; j++) {
                dp[j] = Math.max(dp[j-1], dp[j]) + board[i][j];
            }
        }
        return dp[n-1];
    }
}

二維dp ,當前值爲左值或上值加當前價值

public class Bonus {
    public int getMost(int[][] board) {
        // write code here
        int m = board.length;
        int n = board[0].length;
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (i >= 1 && j >= 1) { 
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
                } else if (i >= 1) {
                    dp[i][j] = dp[i-1][j];
                } else if (j >= 1) {
                    dp[i][j] = dp[i][j-1];
                } 
                dp[i][j] += board[i][j];
            }
        }
        return dp[m-1][n-1];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章