前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【剑指offer:求礼物的最大价值】动态规划解法

【剑指offer:求礼物的最大价值】动态规划解法

作者头像
心谭博客
发布2020-04-21 10:40:08
5300
发布2020-04-21 10:40:08
举报
文章被收录于专栏:YuanXin

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

解法:动态规划

声明状态数组dp是一个 m*n 的二维数组。dp[i][j]的默认值是 0,它的含义是:在坐标点(i,j)处,能得到的最大价值礼物。所以,整个棋盘的最大价值礼物就是 dp[m-1][n-1] 的值。

现在来看状态转移的过程:

  • 出发点是左上角,且只能向右/下移动,所以第一列和第一行中的 dp 值,就等于:当前礼物价值+上一个 dp 值
  • 对于一般坐标(i,j),dp[i][j] = grid[i][j] + max(dp[i - 1][j], dp[i][j - 1])

代码实现如下:

代码语言:javascript
复制
// ac地址:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof/
// 原文地址:https://xxoo521.com/2020-03-11-max-value-of-gift/
/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxValue = function(grid) {
    const rowNum = grid.length;
    const colNum = grid[0].length;
    const dp = [];
    for (let i = 0; i < rowNum; ++i) {
        dp[i] = [];
        for (let j = 0; j < colNum; ++j) {
            dp[i][j] = 0;
        }
    }

    dp[0][0] = grid[0][0];
    for (let i = 1; i < rowNum; ++i) {
        dp[i][0] = grid[i][0] + dp[i - 1][0];
    }

    for (let j = 1; j < colNum; ++j) {
        dp[0][j] = grid[0][j] + dp[0][j - 1];
    }

    for (let i = 1; i < rowNum; ++i) {
        for (let j = 1; j < colNum; ++j) {
            dp[i][j] = grid[i][j] + Math.max(dp[i - 1][j], dp[i][j - 1]);
        }
    }

    return dp[rowNum - 1][colNum - 1];
};

时间复杂度和空间复杂度都是$O(N^2)$。在 leetcode 上显示,内存击败 100%,时间击败 96.63%:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解法:动态规划
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档