【JZ-47】礼物的最大价值(动态规划)

题目

在这里插入图片描述参考

算法思路

v a l u e ( i , j ) value(i,j) value(i,j) 表示单元格 ( i , j ) (i,j) (i,j) 的礼物价值, f ( i , j ) f(i,j) f(i,j) 表示从棋盘左上角走到单元格 ( i , j ) (i,j) (i,j) 的礼物最大价值,显然有转移方程 f ( i , j ) = m a x { f ( i − 1 , j ) ,   f ( i , j − 1 ) } + v a l u e ( i , j ) f(i,j)=max\{f(i-1,j),\ f(i,j-1) \}+value(i,j) f(i,j)=max{f(i1,j), f(i,j1)}+value(i,j)
初始状态 f ( 0 , 0 ) = v a l u e ( 0 , 0 ) f(0,0)=value(0,0) f(0,0)=value(0,0)
边界处理

  1. i == 0 && j != 0时,为矩阵第一行元素,只能从左边到达: f ( i , j ) = f ( i , j − 1 ) + v a l u e ( i , j ) f(i,j)=f(i,j-1)+value(i,j) f(i,j)=f(i,j1)+value(i,j)
  2. i != 0 && j == 0时,为矩阵第一列元素,只能从上边到达: f ( i , j ) = f ( i − 1 , j ) + v a l u e ( i , j ) f(i,j)=f(i-1,j)+value(i,j) f(i,j)=f(i1,j)+value(i,j)

返回值 f ( m − 1 , n − 1 ) f(m-1,n-1) f(m1,n1),其中 m,n 为矩阵的行数和列数

注意:由于 f ( i , j ) f(i,j) f(i,j) 只与 f ( i − 1 , j ) f(i-1,j) f(i1,j) f ( i , j − 1 ) f(i,j-1) f(i,j1) v a l u e ( i , j ) value(i,j) value(i,j) 有关,所以可以直接在原矩阵上修改,省去了额外的矩阵空间。

具体代码

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(i == 0 && j == 0)continue;
                if(i == 0)grid[i][j] += grid[i][j - 1];//第一行
                else if(j == 0)grid[i][j] += grid[i - 1][j];//第一列
                else grid[i][j] += Math.max(grid[i][j - 1], grid[i - 1][j]);
            }
        }
        return grid[m - 1][n - 1];
    }
}

代码改进

当矩阵规模很大时,为第一行或列的情况只占极少数,几乎循环的每一轮都冗余了一次判断。可以先初始化第一行和第一列,然后再遍历矩阵。

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        for(int j = 1; j < n; j++){//初始化第一行
            grid[0][j] += grid[0][j - 1];
        }
        for(int i = 1; i < m; i++){//初始化第一列
            grid[i][0] += grid[i - 1][0];
        }
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                grid[i][j] += Math.max(grid[i][j - 1], grid[i - 1][j]);
            }
        }
        return grid[m - 1][n - 1];
    }
}

复杂度分析

  • 时间复杂度: O ( m n ) O(mn) O(mn),其中 m,n 为矩阵的行数和列数
  • 空间复杂度: O ( 1 ) O(1) O(1)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值