首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >动态规划-LCR 166.珠宝的最大价值-力扣(LeetCode)

动态规划-LCR 166.珠宝的最大价值-力扣(LeetCode)

作者头像
白天的黑夜
发布2025-10-22 16:54:08
发布2025-10-22 16:54:08
700
举报

一、题目解析

frame二维矩阵中每个值代表珠宝的价值,现在从左上角开始拿珠宝,只能向右或向下拿珠宝,到达右下角时停止拿珠宝,要求拿的珠宝价值最大。

二、算法解析

1.状态表示

我们想要知道的是到达[i,j]为位置时的最大价值,所以dp[i][j]表示:到达[i,j]位置时,珠宝的最大价值

2.状态转移方程

依旧根据最近一步划分问题

3.初始化

初始化要确保(1)初始化的值保证后面填表正确(2) 下标的映射关系

观察左边的图,我们能发现带有小圆圈的格子在填表时会发生越界操作,所以只需要加一行加一列即可。都初始化为0 则是保证填值正确,对于小圆圈dp[1][1]的最大价值为i它本身的价值,所以dp[i-1][j]和dp[i][j-1]初始化为0,其他同理,

此时下标的映射关系为dp[i][i]~fraem[i-1][j-1]

4.填表顺序

从左到右,从上到下

5.返回值

返回到达右下角的最大价值,即dp[i][j]

可以动手去自己实现一下,链接:LCR 166. 珠宝的最高价值 - 力扣(LeetCode)

三、代码示例

代码语言:javascript
复制
class Solution {
public:
    int jewelleryValue(vector<vector<int>>& frame) {
        int m = frame.size(),n = frame[0].size();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        for(int i = 1;i<=m;i++) 
        {
            for(int j = 1;j<=n;j++)
            {
                dp[i][j] =  max(dp[i][j-1]+frame[i-1][j-1],dp[i-1][j]+frame[i-1][j-1]);
            }
        }
        return dp[m][n];
    }
};

看到最后,如果对您有所帮助,还请点赞、收藏、关注,点点关注不迷路,我们下期再见!

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

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

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

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

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