动态规划|【路径问题】礼物的最大价值(LCR 166.珠宝的最高价值)

简介: 动态规划|【路径问题】礼物的最大价值(LCR 166.珠宝的最高价值)



题目

LCR 166. 珠宝的最高价值

(现在leetcode上面是这个题)这个题跟下面这个题叙述方式一样,就拿下面这个 题来讲解)

题目描述:

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

示例1:

输入:[[1,3,1],[1,5,1],[4,2,1]]

输出:12

解释:路径1-3-5-2-1可以拿到最多价值的礼物

题目解析

用示例1 来举例:输入[[1,3,1],[1,5,1],[4,2,1]],形成如下的一个3*3的矩阵,我们把这个二维矩阵叫cost矩阵,每个位置都是一个对应价值的礼物,要求我们拿到最多价值的礼物,那就意味着,要走最大的值

题目中说从左上角出发,每次可以向下走或者向右走,那个数值大往哪走,右下角为终点,

思路

1.状态表示

       我们这里以某一个位置为结尾来确定状态表示,又根据题目要求,需要我们确定所走路径的拿到礼物的最大价值,所以状态表示dp[i][j]表示起点走到【i,j】位置,此时拿到礼物的最大价值

2.状态转移方程

       状态表示的经验就是根据最近的一步划分问题,那我们怎么到达【i,j】,第一种要么从左边向右走到【i,j】位置,要么从上边向下走到【i,j】位置

所以dp[i][j]可以有两种方式得来

       a)从左边向右走:也就是从【i,j-1】位置走到【i,j】位置,然后拿到【i,j】位置的礼物价值,如果要起点到【i,j】位置拿到礼物的价值最大(dp[i][j]),就需要起点到【i,j-1】位置拿到礼物的价值最大(dp[i][j-1]),因此dp[i][j]=dp[i][j-1]+cost[i][j]

       b)从上边向下走:同理a,这个方式对应的状态转移方程为dp[i][j]=dp[i-1][j]+cost[i][j]

最后取这两种情况的最大值就行

3.初始化

之前说过,初始化的目的就是为了让填表不越界,我们 首先要分析填哪些位置回越界,因为填表的时候是根据状态转移方程来填表的,状态转移方程

根据这两个公式计算后用最大的那个值填表,计算是一个位置需要这个位置上面的那个值,和这个位置左边的值,但是第一行没有上面的值,第一列没有左边的值。所以第一行和 第一列需要初始化

之前也讲过,虚拟 结点的初始化,虚拟结点就是在创建dp表的时候多创建一行和多创建一列,然后从【1,1】位置开始填表。

虚拟结点里面的值要确保dp表中填的值的准确性。所以填0是最合适的,相当于里面礼物的的价值为0。

4.填表顺序

从上至下,从左至右

5.返回值

因为多开了一行和一列,所以返回dp[m][n]就行。

代码

int jewelleryValue(int** frame, int frameSize, int* frameColSize) 
{
    //创建dp表
    int dp[1000][1000]={0};
    //初始化这个刚好全是0就不用初始化了
    //行和列
    int m=frameSize;
    int n=frameColSize[0];
    for(int i=1;i<m+1;i++){
        for(int j=1;j<n+1;j++)
        {
            dp[i][j]=frame[i-1][j-1]+((dp[i-1][j]>dp[i][j-1])?dp[i-1][j]:dp[i][j-1]);
        }
    }
    return dp[m][n];
}

空间复杂度:O(mn)

时间复杂度:O(mn)

相关文章
|
6月前
|
机器学习/深度学习 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
91 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-983 最大获利
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-983 最大获利
67 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-985 幸运的店家
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-985 幸运的店家
81 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
82 0
【动态规划上分复盘】下降路径最小和|礼物的最大价值
【动态规划上分复盘】下降路径最小和|礼物的最大价值
|
算法
【学会动态规划】礼物的最大价值(7)
【学会动态规划】礼物的最大价值(7)
51 0
【动态规划刷题 4】礼物的最大价值&&下降路径最小和
【动态规划刷题 4】礼物的最大价值&&下降路径最小和
|
6月前
|
算法
【动态规划专栏】专题二:路径问题--------3.礼物的最大价值
【动态规划专栏】专题二:路径问题--------3.礼物的最大价值
46 0
|
4月前
|
存储 定位技术
【天梯赛】L2-048 寻宝图 (DFS做法)
遇到一个非'0'字符(也就是'1'和 宝藏'2'到'9')就让ans++,同时将这个非'0'字符染色为'0',然后往四个方向(上、下、左、右)搜索,这里的目的是那一片岛屿(也就是那一片为'1'的部分)都染色为‘0’。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。为了判断有宝藏的岛屿,这里我开了一个全局变量f来判断这一片岛屿是否有宝藏(也就是有无字符'2'-'9'),当搜到字符'2'~'9'时就将f标记为1。在一行中输出 2 个整数,分别是岛屿的总数量和有宝藏的岛屿的数量。
75 5