剑指 Offer 42. 连续子数组的最大和 47.礼物的最大价值

news/2024/6/16 9:57:52 标签: 动态规划, 算法

剑指 Offer 42. 连续子数组的最大和

题目链接

思路:1、dp[i]表示以i为结尾的连续子数组的最大和。

2、递推公式。dp[i]可以由两个方向推导来,一是延续之前的子数组继续累加,二是舍弃掉前面的子数组,从当前位置重新开始累加,这两种情况取最大值,dp[i]=max(dp[i-1]+nums[i],nums[i])

3、初始化dp数组。dp[0]是以0为结尾的最大子数组和,两个方向的结果都是nums[0],非零下标都依次由之前的推导来,所以不用初始化

4、遍历顺序。由递推公式看出dp[i]是依赖于dp[i-1]的,所以遍历顺序就是从前往后遍历

5、打印dp数组

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> dp(nums.size());
        dp[0]=nums[0];
        int result=dp[0];
        for(int i=1;i<nums.size();i++){
            dp[i]=max(dp[i-1]+nums[i],nums[i]);//一个是延续前面的子数组继续累加,一个是把前面抛弃掉,从新累加
            //由以上递推公式看出后一个都会由前一个推出来,所以非零下标不需要初始化
            if(dp[i]>result) result=dp[i];
        }
        return result;
    }
};

47. 礼物的最大价值

题目链接

本题没有看题解,直接自己写的,思考过程就是动规五部曲。本题和力扣62.不同路径比较像。

1、dp数组的含义。显然要用一个二维dp数组来记录信息。dp[i][j]表示到达i,j时可以拿到礼物的最大价值。

2、递推公式。题目中说的很明确了,每次只能向下向右,所以dp[i][j]只能由上面和左面推导来,dp[i][j]=max(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j])

3、初始化。dp[0][0]显然就只能是nums[0][0],然后因为需要从上面和左边推导出来,所以第一行第一列都需要初始化,初始化的值是累加后的值。

4、遍历顺序。就是从上到下从左到右。

5、打印dp数组。

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

里面累加的过程还是需要再熟练,注意sum要定义在外面,不然每次遍历sum都会被重新赋值;初始化完第一行后需要将sum重新置为grid[0][0],重新累加。

出错原因:dp数组初始化里面没有写vector<int>。


http://www.niftyadmin.cn/n/192699.html

相关文章

aws lambda 转换 office/txt/html 为 pdf

简洁的写作需要勇气。让事物变小是一种深思熟虑的、困难的和有价值的行为。大多数书籍本应是一篇博客文章。大多数博客文章本应是一条微博。大多数微博本应不写。 概述 aws lambda AWS Lambda 是一项无服务器事件驱动型计算服务&#xff0c;该服务使您可以运行几乎任何类型的…

如何在网络媒体上发布新闻、确保将新闻最大化地传播出去

随着互联网技术的发展和普及&#xff0c;新闻发布已经不再局限于传统的纸媒和广播电视媒体&#xff0c;越来越多的新闻发布机构选择通过网络媒体来发布新闻。然而&#xff0c;对于新闻发布机构和从事新闻报道的人员来说&#xff0c;如何在网络媒体上发布新闻、确保新闻的准确性…

SSM—【笔记】1.3Maven高级

一、分模块开发与设计 意义&#xff1a;将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间的相互调用&#xff0c;接口共享 实现&#xff1a;&#xff08;模块拆分&#xff09; ①创建Maven模块 ②书写模块代码 ③通过maven指令安装模块到本地仓库(install指令&a…

【机器学习】P12 前向传播(Forward Propergation)

前向传播 机器学习的 Forward Propagation&#xff08;前向传播&#xff09;是指在神经网络中&#xff0c;从 输入层 &#xff08;Input Layer&#xff09;开始&#xff0c;按照预定义的 权重&#xff08;w⃗\vec{w}w&#xff09; 和 偏置值 &#xff08;bbb&#xff09;计算每…

Javaweb | ServletContext对象

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; ServletContext对象 概述 全局对象&#xff0c;拥有作用域&#xff0c;对应Tomcat的Web应用Web服务器启动时&#xff0c;会为每一个Web应用程序创建一块共享的存储区…

NOIP模拟赛 轰炸(bomb)

题目描述 有nnn座城市&#xff0c;城市之间建立了mmm条有向的地下通道。 你需要发起若干轮轰炸&#xff0c;每轮可以轰炸任意多的城市。但在每次轰炸城市中&#xff0c;不能同时存在两个城市i,ji,ji,j满足可以通过地下通道从城市iii到达城市jjj。你需要求出最少需要多少轮可以…

YAML配置方法汇总

目录 1 语法 2 配置信息 2.1 字面量&#xff08;普通的值&#xff1a;数字&#xff0c;字符串&#xff0c;布尔&#xff09; 2.2 对象 2.3 Map 2.4 List 2.5 数组 3 总结 1 语法 k:(空格)v&#xff1a;表示一对键值对&#xff08;空格必须有&#xff09;大小写敏感使用…

输入与输出函数—— 关于python 输入和输出你知道多少?

输入与输出函数—— 关于python 输入和输出你知道多少&#xff1f; 文章目录输入与输出函数—— 关于python 输入和输出你知道多少&#xff1f;1️⃣输入 print()&#x1f379;基本语法&#x1f379;%格式化2️⃣ 输入input()&#x1f379;数据类型转换1️⃣输入 print() &…