剑指offer第47题 礼物的最大价值(动态规划)



问题描述:

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于
0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

示例 1:

输入: 
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 12
解释: 路径 13521 可以拿到最多价值的礼物


解题思路:

  这题如果使用深搜会超时,应该使用动态规划,由于走格子的时候只能向下或者向右,所以每个格子只有两个方向来源,那么当前格子的最大值就等于格子本身加上它上边路径或者左边路径的最大值。
  我们建立一个二维的dp表,dp[i][j]表示从起点走到当前格子可以拿到的最多礼物,所以dp公式为:dp[i][j] = grid[i][j] + Math.max(dp[i-1][j], dp[i][j-1]);



代码实现:

public int maxValue(int[][] grid) {
    
    
	int row = grid.length;
	int col = grid[0].length;
	int[][] dp = new int[row][col];
	dp[0][0] = grid[0][0];   //初始化
	//初始化第一行和第一列
	for(int i=1; i<col; i++) {
    
    
		dp[0][i] = dp[0][i-1] + grid[0][i];
	}
	for(int i=1; i<row; i++) {
    
    
		dp[i][0] = dp[i-1][0] + grid[i][0];
	}
	//构建dp数组
	for(int i=1; i<row; i++) {
    
    
		for(int j=1; j<col; j++) {
    
    
			dp[i][j] = grid[i][j] + Math.max(dp[i-1][j], dp[i][j-1]);
		}
	}
	return dp[row-1][col-1];
}

提交结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HC199854/article/details/109303228