动态规划:07.路径问题_珠宝的最大价值_C++

题目链接:

目录

题目链接:LCR 166. 珠宝的最高价值 - 力扣(LeetCode)

一、题目解析

题目:

解析:

二、算法原理

1、状态表示

2、状态转移方程

3、初始化

4、填表顺序

5、返回值

三、编写代码


一、题目解析

题目:

解析:

有过做前几道题的经验,我们会发现这道题其实就是最短路径问题,只不过变成了最“长”路径,我们有多种方式到达右下角,但是我们要求到达=右下角的同时,珠宝价值也最大

二、算法原理

1、状态表示

我们在状态标识的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。 

  状态简单理解就是dp表内某一个值代表的含义。

如何确定状态表示

  • 题目要求

   简单的题目里一般会给出

  • 经验+题目要求

  越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。

  • 分析问题的过程中,发现重复子问题

 分析问题的过程中把重复子问题抽象成我们的状态表示,这个更难理解,一切的基础都是我们先对动态规划算法熟练运用。我也不懂,我们慢慢来。

综上:我们通常会以一个位置为结尾或者开始求得我们想要的答案

那我们的这道题得状态表示是什么样的:

根据经验:我们以为一个位置为结尾做题

dp[i][j]状态表示:到达位置(i,j)时,珠宝价值最大

2、状态转移方程

 确定状态表示之后我们就可以根据状态标识推出状态转移方程

  状态转移方程是什么?

不讲什么复杂的,简单来说状态转移方程就是    dp[i][j]等于什么 dp[i][j]=?

  这个就是状态转移方程,我们要做的,就是推出dp[i][j]等于什么

  我们根据状态表示再结合题目+经验去推理转移方程,这一步也是我们整个解题过程中最难的一步

  我们在这道题先简单了解下什么是状态转移方程,之后比较难的题目再细推

  我们知道,我们每次直能向下或者向右走,此时dp表示到达(i,j)该位置时珠宝价值达到最大,那么就是我们向下或者向右到达(i,j)位置后价值达到最大,既然要求最大,(i,j)位置的价值也不会影响,那我们就要要求到达(i-1,j)或者(i,j-1)的珠宝价值达到最大,并且只能选其中最大的那一个

我们再画图可以看出,我们选出到达(i,j)位置之前的最大价值dp[i-1][j]或者dp[i][j-1],再加上本身价值,就是到达(i,j)位置的最大价值

状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i][j-1])+(i,j)的本身价值

3、初始化

 我们创建dp表就是为了把他填满,我们初始化是为了防止在填表的过程中越界

怎么谈越界?

  比如我们在求dp[0][0]时,我们就需要知道dp[-1][0]或者dp[0][-1]的值,但是我们没有这两个位置,就会造成越界。

 不仅仅是第一个位置,我们的第一行和第一列,都存在所要位置的价值最大值不存在问题

 所以我们在创建dp表时,我们需要额外增加一行一列,这样我们的越界问题就解决了

 另外,我们为了让新增的行列元素值不影响填表,我们应该把他们初始化为0

  

4、填表顺序

从左到右,从上到下依次填表,这样能保证我们填表时其它的值都有

5、返回值

返回dp表右下角的值

三、编写代码

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];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值