ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

算法日常・每日刷题--<动态规划>7

算法日常・每日刷题--<动态规划>7 题目描述在一个m × n的棋盘的每一格都放有一个礼物每个礼物都有一定的价值价值大于 0。你可以从棋盘的左上角开始拿格子里的礼物并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物价值请计算你最多能拿到多少价值的礼物输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 12 解释路径 1→3→5→2→1 可以拿到最多价值的礼物解题思路这是典型二维动态规划和「不同路径」是同一种网格 DP 模型。状态定义dp[i][j]走到原网格frame[i-1][j-1]这个位置时能拿到礼物的最大价值。这里 dp 数组下标从 1 开始目的是省去单独处理第一行、第一列边界的代码dp[0][...]和dp[...][0]初始化为 0。状态转移方程机器人只能从上方或者左方走到当前格子我们选择价值更大的那条路径再加上当前格子礼物价值\(dp[i][j]\max(dp[i-1][j],dp[i][j-1])frame[i-1][j-1]\)初始化dp数组全部初始化为 0天然满足边界条件。结果最终答案dp[m][n]对应网格右下角位置。class Solution { public: int jewelleryValue(vectorvectorint frame) { int mframe.size(); int nframe[0].size(); vectorvectorintdp(m2,vectorint(n2,0)); for(int i1;im1;i) { for(int j1;jn1;j) { dp[i][j]max(dp[i-1][j],dp[i][j-1])frame[i-1][j-1]; } } return dp[m][n]; } };
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进