題目描述
在一個 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];
}
}