1 动态规划

1.1 基本思想

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。

与分治法的区别在于,适用于动态规划算法求解的问题,经分解得到的子问题往往不是互相独立的;若用分治法求解,则分解得到的子问题数目太多,导致最终解决原问题需指数时间。原因在于:虽然子问题的数目常常只有多项式量级,但在用分治法求解时,有些子问题被重复计算了许多次,如果可以保存已解决的子问题的答案,就可以避免大量重复计算,从而得到多项式时间的算法。

动态规划法的基本思路是:构造一张表来记录所有已解决的子问题的答案(无论算法形式如何,其填表格式是相同的)。

1.2 适用条件

适用动态规划的问题必须满足最优化原理无后效性

最优化原理(最优子结构性质):

最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质

无后效性:

将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。

子问题的重叠性:

动态规划算法的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其他的算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间

2 最大子段和问题描述

给定n个整数(可能为负数)组成的序列a1,a2,…,an。求该序列形如下式的子段和的最大值:

当所有整数均为负整数时定义其最大子段和为0。依次定义,所求的最优值为:

例如:(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,-2) 该序列的最大子段和为:

3 算法分析

通过对分治算法的分析可知,若记:

则所求的最大子段和为:

由b[j]的定义可知:当时:

否则:

由此可得b[j]的动态规划递归式:

4 C++实现

int maxSubArray(vector<int>& nums) {    int size=nums.size();    int* b = new int[size];    b[0]=nums.at(0);    for(int i=1;i        if(b[i-1]<0){            b[i]=nums.at(i);         }else{            b[i]=b[i-1]+nums.at(i);        }    }    int maxV=b[0];    for(int i=0;i        if(maxV            maxV=b[i];     }    }    return maxV;}

最大子段和动态规划_动态规划解最大子段和问题相关推荐

  1. 最大子段和动态规划_动态规划解决最大正方形问题

    今天的问题 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 来 ...

  2. mysql动态规划_动态规划《开篇》

    动态规划(dynamic programing)和分治法类似,都是通过组合子问题的解来求解原问题的解.(在经典排序算法中的二路归并排序和快速排序都用到了分而治之的思想-分治法). 分治法是将原问题划分 ...

  3. 动态规划背包问题详解(二)---0-1背包问题

    /**  * 对于技术面试,你还在死记硬背么?  * 快来"播"沙糖橘吧,  * 用视频案例为你实战解读技术难点  * 聚焦Java技术疑难点,实战视频为你答疑解惑  * 越&qu ...

  4. LQ训练营(C++)学习笔记_动态规划入门

    动态规划入门 五.动态规划入门 1.动态介绍 1.1动态规划基本思路 1.2 动态规划基本概念 1.2.1 阶段 1.2.2 状态 1.2.3 决策 1.2.4 状态转移方程 1.2.5 策略 1.3 ...

  5. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  6. 最全动态规划题型详解

    文章目录 前言 数字三角形模型 1. 数字三角形 2. 最低通行费 3. 方格取数 总结 最长上升子序列模型 1. 最长上升子序列(LIS) 2. 怪盗基德的滑翔翼 3. 最长公共子序列 4. 最长公 ...

  7. 五大算法之动态规划套路详解(1)

    前言: 一.Why?为什么需要动态规划 二.What?什么是动态规划 三.How?如何利用动态规划做题 四.思路总结 前言: 对于很多学习算法的同学来说,往往是跟着老师和学校教材上课,然后去刷题练熟练 ...

  8. dpresult在python中什么意思_动态规划(DP)的整理-Python描述

    今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容--什么是动态规划? 摘录于<算法图解& ...

  9. 最长公共子序列 - 北京大学郭炜 动态规划代码详解

    最长公共子序列 - 北京大学郭炜 动态规划代码详解 解题思路: 该题可用动态规划解决.动态规划需要我们找出子问题. 假设我们输入两个字符串: ACTTGACC CGTT 那么如何通过动态规划算出其最大 ...

最新文章

  1. Sorenson Capital:值得投资的 5 种 AI 技术
  2. 使用ReaderWriterLock优化文件缓存
  3. 创建对象的方式以及call,apply,bind的区别
  4. 获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot
  5. js 取值 getElementsByTagName,getElementsByName
  6. OS / Linux / SIGCHLD 信号
  7. dos 一行两条命令
  8. 几个简单的排序方式1
  9. How to Fix an App that Crashes in Release but n...
  10. 【升级版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】...
  11. C#动态操作DataTable(新增行、列、查询行、列等)
  12. java初学者只要掌握了以下十大原则,可以让你的技术飙升
  13. C++语言中std::array的神奇用法总结,你需要知道!
  14. 留下考题答案造福我校后来人(考试过后再看,不要抄袭)
  15. 简单就是不复杂 转
  16. Putty打开.pem加密的服务器
  17. Linux终端、控制台复制粘贴
  18. 【Pix4d精品教程】Pix4Dmapper完整航测内业操作流程手把手图文教程
  19. Android中Hilt的简单使用
  20. GateWay的Filter

热门文章

  1. qt qstandarditemmodel rowcount获取行数不正确_MIL+QT实践教程十
  2. ViT (Vision Transformer) ---- SimpleRNN + Self-Attention
  3. NLP---将改变您在未来的沟通方式的7种 nlp 技术 (第一部分(附原始论文))
  4. vue项目中moment的使用(时间戳格式化)
  5. vue cli3 搭建项目 使用vue-router 以及 element-ui
  6. Jconsole/jvisualvm远程监控weblogic中间件配置
  7. Forms(The Definitive Guild to Django)
  8. SpringBoot启动报jdbc连接池错误
  9. VS 2005 命令行cl编译配置 Notepad++设置
  10. 润土之四——构造润土的来由