题目描述
在一个 m*n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于 0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘
1 10 3 8
12 2 9 6
5 7 4 11
3 7 16 5
思路:动态规划
- 状态dp[i][j]:走到当前位置时候礼物的最大值
- 初始化:dp的第一行只能从左走到右所以dp[0][j] = dp[0][j-1] + values[0][j] ,第一列只能从上走到下所以dp[i][0] = dp[i-1][0] + values[i][0];
- 状态转移方程:dp[i][j] = Math.max(dp[i-1][j] , dp[i][j-1])
- 结果:dp[m-1][n-1]
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];
dp[0][0] = board[0][0];
for(int i = 1 ; i < n ; i++){
dp[0][i] = dp[0][i-1] + board[0][i];
}
for(int i = 1 ; i < m ; i++){
dp[i][0] = dp[i-1][0] + board[i][0];
}
for(int i = 1 ; i < n ; i++){
for(int j = 1 ; j < m ; j++){
dp[i][j] = Math.max(dp[i-1][j] , dp[i][j-1]) + board[i][j];
}
}
return dp[m-1][n-1];
}
}