题目
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例 1:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物、
代码
一月一度的幺蛾子
输出0!!!!为什么到了递交这就是输出12
我淦!编译器怎么做到输出12的(肯定不是我代码有错,口亨
(虽然把dfs写成dps的我肯定也有问题…
这么写其实问题也挺大的感觉。。应该会超时, 不过dfs的话剪枝一下应该问题不大吧
class Solution {
static int max = 0;
public static int maxValue(int[][] grid) {
dfs(grid, 0, 0, grid[0][0]);
return max;
}
public static void dfs(int[][] grid, int x, int y, int sum) {
if (x == grid.length - 1 && y == grid[0].length - 1) {
if (sum > max) {
max = sum;
}
}
if (x < grid.length - 1) {
dfs(grid, x + 1, y, sum + grid[x + 1][y]);
}
if (y < grid[0].length - 1) {
dfs(grid, x, y + 1, sum + grid[x][y + 1]);
}
}
}
常规dp写法(不擅长动态规划的我十分勉强
不过做了几道有感觉了!
特别是这个定义dp二维数组的时候把原空间+1
这样就可以不用考虑边界的问题直接一个for循环拿下!巴适的很
class Solution {
public static int maxValue(int[][] grid) {
int x = grid.length;
int y = grid[0].length;
//dp[i][j]表示grid[0][0]到grid[i - 1][j - 1]时的最大价值
int[][] dp = new int[x + 1][y + 1];
for (int i = 1; i <= x; i++) {
for (int j = 1; j <= y; j++) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
}
}
return dp[x][y];
}
}