礼物的最大值算法题(动态规划)

礼物的最大价值

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

示例:

123
456
789

按照题目所走路线为1-4-7-8-9.最多拿29的礼物

分析:1.将它从最左上角开始移动算起,2.先要得到它的向右一格和向下一格的礼物值,3.选择较大的,然后走到最右下角,4.然后将他所走过的格子里面代表礼物的数值相加(这一步可在第二部步中初始相加)得到礼物最大值

这里还可以理解为最右下角的值选择它相邻的左边值和上边值,看那个大选择哪个

我们用2*2棋盘可以清楚发现

由甲到丁,中间隔着丙、乙,现在就判断丙、乙哪个大,就选择那条路走(时刻记着向下或者向右走的规则)

算法代码演示

public class solution3 {
    public static void main(String[] args) {
      int[][] grid=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
        System.out.println("礼物的最大值:"+getMaxValue(grid));
    }
    private static int getMaxValue(int[][] grid) {
        //代表礼物这个二维数组的行数
        int m = grid.length;
        //代表礼物这个二维数组的0行所代表的长度,相当于列数
        int n = grid[0].length;
        //如果礼物为空或者该数组行数为0或者0行所代表的长度为0,则返回0,即礼物价值为0
        if(grid == null || m == 0 || n == 0)
            return 0;
        //初始这张棋盘
        int[][] chessboard = new int[m][n];
        //该棋盘的第一个数与礼物的第一个数相对应
        chessboard[0][0] = grid[0][0];
        //第一列只能从上面下来,这里相当于选择向下走时,下面的数和上面的数相加
        for(int i = 1;i < m;i++)
            chessboard[i][0] = chessboard[i - 1][0] + grid[i][0];
        //第一行只能从左边过来 这里相当于选择向左走时,左边的数与右边的数相加
        for(int j = 1; j < n;j++)
            chessboard[0][j] = chessboard[0][j - 1] + grid[0][j];
        //这里是最后一步即最右下角选择和它相邻的左边的数相加还是和它相邻的上边的数相加
        //这里引入了一个Math.max() 函数返回作为输入参数的最大数字,如果没有参数,则返回 -Infinity。
        for(int i = 1;i < m;i++){
            for(int j = 1;j < n;j++){
                chessboard[i][j] = Math.max(chessboard[i - 1][j],chessboard[i][j - 1]) + grid[i][j];
            }
        }
        return chessboard[m - 1][n - 1];
     }
    }

总结

二维数组还可以自定义,不用我这样使用明确的数字,如果代码存在问题即结果不正确,希望您能指出来

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多维动态规划(MDP)是一种在多维状态空间中求解最优策略的算法。下面是解思路的一般步骤: 1. 定义状态和动作:首先,需要明确问的状态和可选的动作。将问抽象成一个多维状态空间,并确定每个状态下可执行的动作。 2. 定义价值函数:为了评估每个状态的优劣,需要定义一个价值函数来衡量状态的价值价值函数可以是累积奖励、期望回报等。 3. 定义转移函数:转移函数描述了状态之间的转换关系,即在执行某个动作后,当前状态如何转移到下一个状态。转移函数可以是确定性的或概率性的。 4. 构建动态规划表格:根据问的状态空间和动作空间,构建一个多维表格。每个单元格代表一个状态,并记录该状态下执行不同动作所得到的价值。 5. 递归求解最优策略:从最后一个状态开始,根据动态规划的原理递归地计算每个状态的最优价值,并记录最优动作。通过向前逐步计算,可以得到整个状态空间下的最优策略。 6. 优化算法:对于复杂问,可以采用一些优化技巧来减少计算量,如值迭代、策略迭代等。 需要注意的是,多维动态规划算法的实现可能会比较复杂,涉及到状态空间的遍历和动作选择等问。因此,了解问的特点和算法的原理非常重要。 希望这个解思路能对你有所帮助!如果还有其他问,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值