动态规划:最大子序列和
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背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...
最新文章
- three.js 背景图片
- 理解Hinted Handoff
- 【Android 逆向】Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )
- h5 video 手机上无法显示_手机镜象投屏到电视上全屏显示
- VMware vSAN6.7 设计和优化 vSAN 主机 vSAN 6.5带来七大更新 解读VMware超融合增长秘诀
- Redis 高级教程 Redis 安全(2)
- 创建第一个windows服务
- 分析微信聊天记录(1)——获取微信聊天记录
- abaqus对应python版本_Abaqus里应用Python的一些技巧
- m3u8简单教程之我不是药神下载
- alpha-beta 极大极小值剪枝算法
- jenkins 下载插件失败 有效的处理办法(亲测)
- PR(Adobe Premiere Pro)软件基础知识
- QOS中 PQ,CQ.RR,WFQ,CBWFQ,LLQ区分(下)
- 阿里淘咖啡火了 全球九大无人便利店物联网技术方案详解
- 王艾辉:下方重点关注3140 上方3190 破位则追
- php 鸟哥 配置文件,鸟哥:让PHP 7达到最高性能的几个Tips
- 学钢琴看简谱 你看这张图就够了
- 华为路ws5200设置虚拟服务器,华为路由WS5200怎么配置DMZ主机
- 创新方法72变(荣振环)