动态规划:最大子序列和
vector v{ -2,1,-3,4,-1,2,1,-5,4 }; 最大子序列为{1,4,2,1,4} 因此是12
如果我们使用动态规划
动态规划一定要看清四点:
1.状态定义
2.状态转移方程
3.初始值
4.返回值
根据题目可以得到如下四点:
//状态定义 dp[i] 以origin_v[i] 结尾数组最长和
//状态转移方程 dp[i]
//将dp[0], dp[1], dp[2]…dp[i-1]加上origin_v[i],比较大小,最大的即为dp[i] 也就是说dp[i]= max(dp[0] + origin_v[i]//, dp[1] + origin_v[i], dp[2] + origin_v[i]…dp[i - 1] + origin_v[i], origin_v[i])
//注意后面还有个origin_v[i] ,千万别忘记比较了
//初始值 dp[i]=origin_v[0]
//返回值 将dp中的最大数取出来即可
代码
#include<iostream>#include<algorithm>
#include<vector>
#include<string>
using namespace std;
class Solution {public:int longest_sum(vector<int> origin_v) {//状态定义 dp[i] 以origin_v[i] 结尾数组最长和//状态转移方程 dp[i]//将dp[0], dp[1], dp[2].....dp[i-1]加上origin_v[i],比较大小,最大的即为dp[i] 也就是说dp[i]= max(dp[0] + origin_v[i]//, dp[1] + origin_v[i], dp[2] + origin_v[i].....dp[i - 1] + origin_v[i], origin_v[i])//注意后面还有个origin_v[i] ,千万别忘记比较了//初始值 dp[i]=origin_v[0]//返回值 将dp[i]中的最大数取出来即可vector<int > dp(origin_v.size(), 0);if (origin_v.size() == 0){return 0;}int longmax_sum = origin_v[0];dp[0] = origin_v[0];for (int i = 1;i < origin_v.size();i++){int tempmax = origin_v[i];for (int j=0;j<i;j++){tempmax = max(tempmax, dp[j] + origin_v[i]);}dp[i] = tempmax;longmax_sum = max(longmax_sum, dp[i]);}return longmax_sum;}
};int main()
{Solution s;vector<int> v{ -2,1,-3,4,-1,2,1,-5,4 };//vector<int> v{ 2,-1,5 };int max_sum = s.longest_sum(v);cout << "max_sum=" << max_sum << endl;}
思考
当我们正在暗暗自喜时,认真看看代码,有没有发现一个问题。状态转移方程:max(dp[0] + origin_v[i], dp[1] + origin_v[i], dp[2] + origin_v[i]…dp[i - 1] + origin_v[i], origin_v[i]) 这个不就是看origin_v[i]是否是大于0吗?再看看题目vector v{ -2,1,-3,4,-1,2,1,-5,4 }的最大子序列和。不就是将数组中大于0的数全部加一遍即可。===》是不是发现简单问题被我们复杂化了。
但是我们正因为如此,才需要多多思考,一个问题想出不同的解法。从时间复杂度,空间复杂度入手。 比如拿LRU LFU 举例。 为什么 LRU底层结构是散列表+双向链表?为什么LFU 的底层结构是用双向链表嵌套?
动态规划:最大子序列和相关推荐
- 动态规划--连续子序列的最大和
给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列是所有连续 ...
- 动态规划之子序列问题
文章目录 一.最长递增子序列I 二. 最长递增子序列II 二.数字和最大的递增子序列 三.连续子数组最大和 四.最长公共子序列 一.最长递增子序列I 题目描述 给定一个长度为N的数列,求数值严格单调递 ...
- Java之动态规划之子序列问题
目录 0.动态规划问题 一.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 二.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 三.本质上升子序列个数 1.题目描述 2.问题分析 ...
- 动态规划之子序列以及子数组类型的问题
子序列类型的问题 两种思路 第一种思路模板是一个一维的 dp 数组:比如最长递增子序列.在这种思路中 dp 数组的定义是:以 nums[i] 结尾的目标子序列(最长递增子序列)的长度是 dp[i] 第 ...
- 动态规划——最大子序列和
背景 给定一个整数数组num[i]num[i]num[i],找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 思路 用数组dp[i]dp[i]dp[i]来保存遍历到第i位时 ...
- 0804------算法笔记----------最长公共子序列
1.动态规划和子序列 1.1 动态规划的特征: a)最优子结构,求问题的解必须获取子问题的最优解: b) 重叠子问题,使用原始的递归存在大量的重复计算. 1.2 子序列的概念: a)子序列中的元素都是 ...
- 动态规划系列问题—从小白到大佬的入门、进阶之旅!!!
前言 本篇文章写了将近一万五千字,整理了关于动态规划系列问题的绝大部分分支,包括动态规划的介绍,相关术语等基础内容,也有区间DP,状压DP等进阶知识. 不管你是刚学习该算法的小白,还是对该算法有了一定 ...
- 算法——动态规划(DP)
动态规划问题,大致可以通过以下四部分进行解决: 划分阶段:按照问题的时间或空间特征,把问题分为若干个子阶段.(划分后的子阶段一定要是有序的或者是可排序的,否则问题就无法求解.) 状态表示:将问题发展到 ...
- 动态规划之背包问题——01背包
算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...
最新文章
- CodeForces - 1486D Max Median(二分+最长连续子段和)
- 聊聊HTTPS和SSL/TLS协议
- wince下Gpio 驱动程序
- Android极光推送
- 拿4k的前端开发都会做些什么?
- PAT (Basic Level) Practice (中文)答案合集
- 中国书写工具行业市场供需与战略研究报告
- java声明接口_为什么必须用Java声明接口?
- i58300h和i7 8750h哪个好 i58300h和i7 8750h对比差距大吗
- 今天正式开始做毕业设计——自助装机系统
- elementUI的tree组件搜索过滤,可识别拼音,且不区分大小写
- Source Files 与 Resource Files 的区别
- 解决IE下input事件初始化自动执行的问题
- SAS编程|ADAM阶段性小结
- 使用iMovie和Keynote制作App Preview
- Hoofball(B题)
- python ——时间间隔
- 国际版抖音正确打开方式
- 【XSY2500】都城(树形dp)
- 华东地区博友链接集合(陆续增加中)
热门文章
- DataFrame的loc,iloc访问方式
- 男子马云性格与星座关系(转)
- 网络安全之ENC1应用内/外网音视频传输完全隔离方案
- 配置zabbix监控nginx状态,监控华为路由器
- Fiddler的介绍和使用
- 自动驾驶玩漂移,蛇皮走位何其骚!斯坦福最新研究:《头文字D》无人车版来了...
- GaiaX开源解读 | 基于优酷业务特色的跨平台技术
- Rasa 3.x 学习系列-Rasa [3.5.8] -2023-05-12新版本发布
- 自由开发者_免费可商用的图片资源推荐
- 我在的互联网医疗公司解散了