【动态规划刷题 4】礼物的最大价值&&下降路径最小和

简介: 【动态规划刷题 4】礼物的最大价值&&下降路径最小和

礼物的最大价值

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


链接: 剑指 Offer 47. 礼物的最大价值

示例 1:

输入:

[

[1,3,1],

[1,5,1],

[4,2,1]

]

输出: 12

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

1.状态表示

对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式:

  1. i. 从 [i, j] 位置出发,……;
  2. ii. 从起始位置出发,到达 [i, j] 位置,……;

这⾥选择第⼆种定义状态表⽰的⽅式:

dp[i][j] 表⽰:⾛到 [i, j] 位置处,此时的最⼤价值。

2.状态转移方程

对于 dp[i][j] ,我们发现想要到达 [i, j] 位置,有两种⽅式:

  1. i. 从 [i, j] 位置的上⽅ [i - 1, j] 位置,向下⾛⼀步,此时到达 [i, j] 位置能 拿到的礼物价值为 dp[i - 1][j] + grid[i][j] ;
  2. ii. 从 [i, j] 位置的左边 [i, j - 1] 位置,向右⾛⼀步,此时到达 [i, j] 位置能 拿到的礼物价值为dp[i][j - 1] + grid[i][j]

我们要的是最⼤值,因此状态转移⽅程为:

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

3. 初始化


为了解决一些边界条件,我们可以添加辅助节点,

在本题中,「添加⼀⾏」,并且「添加⼀列」后,所有的值都为 0 即可。


4. 填表顺序

根据「状态转移⽅程」,填表的顺序是「从上往下填写每⼀⾏」,「每⼀⾏从左往右」


5. 返回值

应该返回 dp[m][n] 的值。


代码:

 int maxValue(vector<vector<int>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<int>> dp(n+1,vector<int>(m+1));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                dp[i][j]=max(dp[i][j-1],dp[i-1][j])+grid[i-1][j-1];
            }
        }
        return dp[n][m];
    }

931. 下降路径最小和

给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。


链接: 下降路径最小和

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]

输出:13

解释:如图所示,为和最小的两条下降路径

1.状态表示

对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式:

  1. i. 从 [i, j] 位置出发,……;
  2. ii. 从起始位置出发,到达 [i, j] 位置,……;

这⾥仍选择第⼆种定义状态表⽰的⽅式:

dp[i][j] 表⽰:⾛到 [i, j] 位置处,所有下降路径中的最⼩和。

2.状态转移方程

对于 dp[i][j] ,我们发现想要到达 [i, j] 位置,有三种⽅式:

  1. i. 从正上⽅ [i - 1, j] 位置转移到 [i, j] 位置;
  2. ii. 从左上⽅ [i - 1, j - 1] 位置转移到 [i, j] 位置;
  1. iii. 从右上⽅ [i - 1, j + 1] 位置转移到 [i, j] 位置;

我们要的是于是

dp[i][j] = min(dp[i - 1][j], min(dp[i - 1][j - 1], dp[i - 1][j +1])) + matrix[i][j] 

3. 初始化三种情况下的「最⼩值」,然后再加上矩阵在 [i, j] 位置的值。

为了解决一些边界条件,我们可以添加辅助节点,

在本题中,需要「加上⼀⾏」,并且「加上两列」。所有的位置都初始化为⽆穷⼤,然后将第⼀⾏初始化为 0 即可。


4. 填表顺序

填表的顺序是 从上往下


5. 返回值

注意这⾥不是返回 dp[m][n] 的值!

题⽬要求「只要到达最后⼀⾏」就⾏了,因此这⾥应该返回「dp表中最后⼀⾏的最⼩值」。


代码:

    int minFallingPathSum(vector<vector<int>>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();
        vector<vector<int>> dp(m+1,vector<int> (n+2,INT_MAX));
        for(int i=0;i<n+2;i++) dp[0][i]=0;//初始化第一行的值
        int count=0;
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i-1][j+1]))+matrix[i-1][j-1];
            }
        }
        int ret=INT_MAX;//返回值
        for(int i=1;i<=n;i++) ret=min(ret,dp[n][i]);
        return ret;
    }

相关文章
|
机器学习/深度学习 人工智能 算法
阿里公开自研AI集群细节:64个GPU,百万分类训练速度提升4倍
从节点架构到网络架构,再到通信算法,阿里巴巴把自研的高性能AI集群技术细节写成了论文,并对外公布。
阿里公开自研AI集群细节:64个GPU,百万分类训练速度提升4倍
|
SQL 大数据 开发工具
大数据Hive窗口函数应用实例 2
大数据Hive窗口函数应用实例
329 0
|
10月前
|
人工智能 弹性计算 监控
分布式大模型训练的性能建模与调优
阿里云智能集团弹性计算高级技术专家林立翔分享了分布式大模型训练的性能建模与调优。内容涵盖四大方面:1) 大模型对AI基础设施的性能挑战,强调规模增大带来的显存和算力需求;2) 大模型训练的性能分析和建模,介绍TOP-DOWN和bottom-up方法论及工具;3) 基于建模分析的性能优化,通过案例展示显存预估和流水线失衡优化;4) 宣传阿里云AI基础设施,提供高效算力集群、网络及软件支持,助力大模型训练与推理。
|
存储 安全 网络安全
Windows安全防护:构建多层防御体系,守护系统安全
Windows系统的安全性对于保护用户个人信息和企业业务连续运行至关重要。面对日益严峻的网络威胁,我们需要构建多层防御体系,通过采用系统内置的安全防护措施、用户可采取的安全保护措施以及加强用户教育与培训、实施严格的访问控制策略、定期进行系统安全评估与审计、建立应急响应机制以及采用先进的安全防护技术等方式
1011 57
|
存储 Kubernetes 固态存储
IEEE HPCA 2024|LightPool:高性能、轻量级的存储池化架构
IEEE HPCA 2024|LightPool:高性能、轻量级的存储池化架构
|
编译器 开发工具 C语言
vscode安装+配置+使用+调试【保姆级教程】
vscode安装+配置+使用+调试【保姆级教程】
57369 8
|
存储 人工智能 数据可视化
伙伴云连续2年入选Gartner《中国分析平台市场指南》,数据分析能力遥遥领先
伙伴云作为中国分析与商业智能平台代表性厂商,因出色的数据分析能力,入选Gartner2023《中国分析平台市场指南》(《Market Guide for Analytics Platforms, China》,以下简称“指南”),成为入选该报告中唯一一家零代码厂商。
321 0
|
关系型数据库 MySQL 数据库
MySQL连接IDEA详细教程
使用IDEA的时候,需要连接Database,连接时遇到了一些小问题,下面记录一下操作流程以及遇到的问题的解决方法。
1241 0
|
机器学习/深度学习 算法 数据可视化
【模式识别】探秘分类奥秘:最近邻算法解密与实战
【模式识别】探秘分类奥秘:最近邻算法解密与实战
151 0