【Leetcode每日一题】 动态规划 - LCR 166. 珠宝的最高价值(难度⭐⭐)(52)

1. 题目解析

题目链接:LCR 166. 珠宝的最高价值

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了

2.算法原理

想象一下,你正在玩一个寻宝游戏,游戏地图是一个二维网格,每个格子都藏有一定价值的礼物。你的任务是从起点出发,找到一条路径,使得沿途收集到的礼物总价值最大。

1.设置状态表示

首先,我们需要一种方式来记录到达每个格子时的最大礼物价值。这里,我们用dp[i][j]来表示到达网格中第i行第j列这个格子时的最大礼物价值。

2.明确状态转移

想要知道到达某个格子的最大价值,我们需要看看从哪些格子可以到达这里。显然,我们可以从上面的格子[i-1, j]下来,也可以从左边的格子[i, j-1]过来。那么,到达当前格子的最大价值,就是从上面或左边过来时的最大价值,再加上当前格子的礼物价值。所以,我们可以得到状态转移方程:

  • dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j]

其中,grid[i][j]表示第i行第j列格子的礼物价值。

3.初始化工作

为了让状态转移能够顺利进行,我们需要对dp数组进行初始化。一种常用的技巧是在网格的上方和左侧各添加一行一列,并将这些辅助格子的值都设为0。这样做的好处是,当我们开始填表时,可以确保所有需要的状态都已经有了初始值。

4.填表顺序

接下来,我们要开始填表了。根据状态转移方程,我们应该从左上角开始,一行一行地往下填,每一行内又是从左到右地填。这样,当我们填到某个格子时,它上面和左边的格子都已经填好了,我们可以直接利用这些格子的值来进行状态转移。

5.找到答案

最后,当我们填完整个表格后,dp[m][n]的值就是我们想要找的答案,即从起点出发,到达网格右下角格子的最大礼物价值。

3.代码编写

cpp 复制代码
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 - 1][j], dp[i][j - 1]) + frame[i - 1][j - 1];//减一细节
            }
        }
        return dp[m][n];
    }
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

相关推荐
CoovallyAIHub35 分钟前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
沐怡旸37 分钟前
【底层机制】std::shared_ptr解决的痛点?是什么?如何实现?如何正确用?
c++·面试
NAGNIP1 小时前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo2 小时前
半开区间和开区间的两个二分模版
算法
moonlifesudo2 小时前
300:最长递增子序列
算法
CoovallyAIHub7 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
感哥7 小时前
C++ STL 常用算法
c++
CoovallyAIHub7 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
saltymilk17 小时前
C++ 模板参数推导问题小记(模板类的模板构造函数)
c++·模板元编程
感哥18 小时前
C++ lambda 匿名函数
c++