动态规划真让人看得头疼,这只是一种思想,并没有一定的解题规律,当问题出现的时候,对于不太熟悉动态规划的人来说,确实有点难以想到,一般都是采用暴力求法。这里贴一个知乎链接,我觉得动态规划讲的还挺好的,什么是动态规划?

嘿嘿,也不知道会不会有人还会跳回来看看,哈哈。反正是写给自己的,问题不大。既然理解了上面是动态规划,就来几个简单的题目来练练手(题目来源leetcode)。

1 最大子序和

既然是采用的是动态规划,动态规划的是必要条件是无后效性。其思想是大事化小小事化了。也就是说将一个大问题转化成几个小问题,求出小问题,推出大问题的解。

首先,我们来进行状态的定义。我们假设v(i) 能表示下标为 i 时连续数组的最大和。状态的定义确实是个技术活。v(i) 是需要包含nums[ i ]的,这样才能保证连续性,也就是说,v[ i ]并不是代表的前i + 1 的最大子序列的和。而是包含nuns[i ]的最大子序列的和。

接下来就可以写出状态转移方程,v(i) = max(v(i - 1) + nums[i] ,  nums[ i ]),即下标为 i 时连续数组的最大和 肯定等于 nums[ i ] 和下标为 i  - 1时连续数组的最大和 加上nums[ i ]的值中的最大的一个。这里为什么不是v(i) = max(v(i - 1) + nums[i] ,  v(i - 1))?这里需要解释一下,如果这么写的话,有可能v[ i] 和 v[i - 1] 是同一个子序且也不能实现是连续子序的要求。

边界就比较好取了,v(0 ) = nums[0]。我们把v[ i ] 中的最大值取出来,也就得出结果了。代码如下:

 int maxSubArray(vector<int>& nums) {if(nums.empty())return 0;vector<int> v(nums);int maxNum = nums[0];for(int i = 1; i < nums.size(); i++){v[i] = max(v[i - 1] + nums[i], nums[i]);if(maxNum < v[i])maxNum = v[i];}return maxNum;}

我想大家都知道,对于动态规划的题目,只要能写出状态转移方程,那么题目也就差不多啊解出来了。难就难在这,状态的定义到底要怎么定义确实是个技术活。现在再来做一道题。

打家劫舍

这题和上一个题相仿,按着第一个题的分析我们来分析第二题。首先,还是进行状态的定义,还是写成v( i ) 吧,这样看的明白些,表示的是房屋为 i + 1 时能偷到的最高金额。

那么状态转移方程也就简单了,v(i)  =  max(v(i - 1),  v(i - 2) + muns[i]), 这里我们不需要管v(i - 1) 和 v(i - 2 )是怎么来的,这就是无后效性。因为最后的求解是自底向上的,最要满足最开始的边界条件即可。

好了,边界条件也就一概写出来了,v[0] = nums[0], v[1] = max(nums[0], nums[1])。代码也就呼之欲出了:

 int rob(vector<int>& nums) {if(nums.empty())return 0;if(nums.size() == 1)return nums[0];if(nums.size() == 2)return max(nums[1], nums[0]);int res;vector<int> v(nums.size());v[0] = nums[0];v[1] = max(nums[0], nums[1]);for(int i = 2; i < nums.size(); i++){v[i] = max(v[i - 2] + nums[i], v[i - 1]);}return v[nums.size() - 1];}

接下来再看一题,不要睡觉,最后一题了,还都是简单题。

除数博弈

这里我们先撇开数学大神的一行代码求解。。。

老样子,状态定义,还是v(i) 吧(哈哈,简单嘛!),所以你想定义成啥嘛。这样吧,v( i )表示的是,当数字为 i 时,谁开始选择x,其是输(v( i ) = 0)还是赢(v( i ) = 1)。

状态定义了,接下来就是状态转移方程 ,我们假设 找到一个数为 i - m,满足0 < i - m < i 且 i % (i - m) == 0使得v(m) = 0,那么v(i)就是赢的,也就是v(i) = 1。代码如下:

bool divisorGame(int N) {vector<int> v(N+1,0);for(int k=1;k<=N;k++){for(int m=1;m<k;m++){if(k%(k-m)==0 && v[m]==0){v[k]=1;break;}}}return v[N];}

如上,也就知道了每一个v(i) 的值了,只是因为是双重循环,所以时间复杂度达到了O(N²)。空间复杂度为O(N)。

以上都是leetcode的一些简单题型,但是做起来还是很费劲,算法这东西虚无缥缈又有迹可循。每做一种算法题型,无不在赞叹数学的厉害。现在也大致的了解了动态规划的一些解题思想,望后续继续深入理解。

废话不多了,请自己加油,希望看到这篇博客的人也一起共勉!

动态规划(一)一一状态定义和状态转移方程相关推荐

  1. 进程的定义和状态转换

    定义 定义:计算机中程序关于某项数据集合的一次运行过程,是系统进行资源分配和调度的基本单位. 结构组成:程序+数据+PCB(Process Control Block) PCB存放的信息:1)标识符 ...

  2. 14 PP配置-生产主数据-BOM相关-定义项目状态的缺省值

    业务背景:定义项目状态的缺省值 事务码:OS21 SPRO路径:SPRO->生产->基本数据->物料清单->常规数据->BOM 用途->定义项目状态的缺省值 第1步 ...

  3. 13 MM配置-主数据-定义物料状态

    业务背景:定义物料状态 事务码: OMS4 SPRO路径:后勤-常规->物料主数据 ->设置关键字段->定义物料状态 第1步,SPRO进入 第2步,通过"新的条目" ...

  4. 7 FI配置-财务会计-定义字段状态变式(总账科目组)

    业务背景:前台处理业务凭证时,会涉及到哪些会计科目字段是可选的,哪些是必填的,如果控制这些数据是可选还是必填,就需要用到字段状态变式的配置.在使用事务码FS00创建总账科目账户时,需要选择字段状态变式 ...

  5. PNAS:复杂系统方法定义脑状态:外部刺激促使不同大脑状态之间的转换

    系统神经科学的一个基本问题是:如何通过外部刺激,例如唤醒.睡眠.昏迷或神经精神疾病等因素,促使大脑从一种状态转换到另一种状态.这就需要对大脑状态进行准确的定义,而迄今为止对大脑状态的定义依然是难以确定 ...

  6. Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)

    什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...

  7. 连接状态_TCP 连接状态及相关命令学习

    在平时的开发工作中,我们都使用被封装完好的 TCP/HTTP 库去完成需求开发,很少关心底层 TCP 的连接状态,但是一旦遇到较难定位的线上事故,往往都是因为 TCP 连接参数或者使用姿势不对导致的, ...

  8. linux 网络端口状态,Linux下用netstat查看网络状态、端口状态(转)

    转:http://blog.csdn.net/guodongdongnumber1/article/details/11383019 在linux一般使用netstat 来查看系统端口使用情况步. n ...

  9. flutter 局部状态和全局状态区别_给 Android 开发者的 Flutter 指南

    这篇文档旨在帮助 Android 开发者利用既有的 Android 知识来通过 Flutter 开发移动应用.如果你了解 Android 框架的基本知识,你就可以使用这篇文档作为 Flutter 开发 ...

最新文章

  1. 微信小程序开发-滑动操作
  2. 11g Active DataGuard初探
  3. 【译】Privacy on the Blockchain
  4. SAP ADBC和JDBC的对比
  5. CMake学习使用(基于vscode)
  6. 合肥python招聘_2020年合肥京东方招聘官网招聘-合肥京东方招聘官网招聘求职信息-拉勾招聘...
  7. java 中文路径 读取_Java读取文件时中文路径处理
  8. 3. 什么是icmp?icmp与ip的关系_公共关系与人际交往能力自主模式课程相关
  9. 使用java获取网络响应内容--Get请求方式
  10. 做了5年Java,java后端开发简历模板
  11. html5+JS调用摄像头示例
  12. Java三大特性详解
  13. python windows自动化 爬虫_python自动化之爬虫原理及简单案例
  14. Redis数据结构之——sds
  15. win7修复计算机是重装吗,win7系统修复无需重装
  16. 三维场景注记的配置相关(学习记录)
  17. Mysql 统计每周,半个月的数据
  18. 一位IT行业高收入者的理财规划方案
  19. python3 scrapy抓取今日头条视频(西瓜视频)
  20. numpy中的ndarray方法和属性

热门文章

  1. Android Studio如何修改AVD(模拟器)路径
  2. java找不到符号_java编译时找不到符号,怎么处理
  3. PyDev+Eclipse4.2.2如何正确显示中文
  4. 印度的密教经典---古老的祝福
  5. unity 显示太阳_Unity光线追踪实践
  6. (超详细保姆级教程)CISCN_2023--Web-Unzip(内有做题网站)
  7. 不规则动词表原卷(初中)
  8. cron项目启动执行一次_集团要闻丨陕钢集团召开品牌战略咨询项目启动会暨第一次培训会...
  9. 关于JVM(基本常识)
  10. 什么是JVM?什么是JDK? 什么是JRE?