本次文档也是对动态规划的 再认识 。
之前写过一些文章,在处理动态规划问题的时候依据的思路是 :暴力搜索->加缓存->动态规划。相关文章有:算法八——动态规划,动态规划——0-1背包问题,动态规划——矩阵中的最短路径长度等等。
最近在看问题的时候发现,只要能明白暴力搜索是怎么搜索的,跟哪些条件有关系,不经过前面2个步骤也能写出动态规划方程。大家知道动态规划方程出来了,基本上问题就解决了。写下文章记录一下 。
如果看不出和哪些条件有关系,或者找不到动态转换关系,还是要依据步骤一步一步来。

1 53. Maximum Subarray

输入:int数组,有正有负
输出:找到所有子数组的和,返回其中最大的。
规则:子数组是一个连续的数组,至少包含一个元素。
例如:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

分析:对于任意一个元素nums[i],可以开启一个子序列{nums[i]},也可以追加在前一个数字子序列的后面{…nums[i-1],nums[i]}。
对于开启一个子序列的情况 ,子数组和=nums[i]。
对于追加的情况:目标是要求子数组和,所以只要之前以nums[i-1]为结尾的子数组的和+nums[i]即可。假设dp[i]=以nums[i]为结尾的子数组的最大的和。
最后结果在所有dp元素中查找最大值。

dp[i] = Math.max(nums[i],nums[i+dp[i-1]])

动归特征:与前一个元素相关;与以前一个元素为结尾的子数组最大和相关。
之后就是写代码了。

class Solution {public int maxSubArray(int[] nums) {int n = nums.length;int[] dp = new int[n];dp[0] = nums[0];int max = dp[0];for(int i=1;i<n;i++){dp[i] = Math.max(nums[i],dp[i-1]+nums[i]);max = Math.max(max,dp[i]);}return max;}
}

进一步空间优化,可以自己思考。

2 121. Best Time to Buy and Sell Stock

输入:int数组,表示每天的股价。
输出:最大的盈利
规则:只可以买一次,卖一次。只能先买后卖。
例子:
Input: [7,1,5,3,6,4]
Output: 5
Explanation: 在价格为1的时候买入,在价格为6的时候卖出。
分析:只能买卖一次,先买后卖,说明是要找max(price[j]−price[i]),j>imax(price[j]-price[i]),j>imax(price[j]−price[i]),j>i。对于每一个j,只要找到min(price[i]),i=0,1...j−1min(price[i]),i=0,1...j-1min(price[i]),i=0,1...j−1即可。

class Solution {public int maxProfit(int[] prices) {int maxProfit = 0;int minPrice = Integer.MAX_VALUE;for(int i=0;i<prices.length;i++){minPrice = Math.min(minPrice,prices[i]);maxProfit = Math.max(maxProfit,prices[i]-minPrice);}return maxProfit;}}

动态规划再理解(53、121、174)相关推荐

  1. 再理解RankNet算法

    再理解RankNet算法 前面的一篇博文介绍了学习排序算法(Learning to Rank)中的RankNet算法.如下:http://blog.csdn.net/puqutogether/arti ...

  2. 动态规划练习三:换钱问题(动态规划概念理解与记忆搜索法概念理解对比)

    题目描述 给定数组arr,数组中所有的值都为正数,且不为空不重复.数组中每个数代表一种货币的面值,每种面值的货币可以使用任意张,然后,给一个aim,代表要换钱的面值,请问,用数组中的面值换钱,总共有多 ...

  3. 再理解:零空间、行空间、列空间、左零空间、基础解系、极大线性无关组、齐次解、非齐次解之间的关系

    再理解:零空间.行空间.列空间.左零空间.基础解系.极大线性无关组.齐次解.非齐次解之间的关系 1.再理解:零空间.行空间.列空间.左零空间.基础解系.极大线性无关组.齐次解.非齐次解之间的关系 1. ...

  4. Mcad学习笔记之委托再理解(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)...

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  5. 时序电路——DFF再理解

    时序电路--DFF再理解 之前对DFF的理解有些模糊,直到有次在实践中遇到了一些问题,含糊其词的也不能解决问题,于是乎就把DFF理解透彻透彻,毕竟这可是时序电路的基本概念. 不正确的理解 之前理解的, ...

  6. 机器学习之回归(Regression)再理解

    文章目录 一 前言引入 1. 回归定义及应用场景 2. 解决步骤 3. 过拟合和解决方法 二 回归问题再理解 1. 问题提出 2. 问题解决 三 结束语 一 前言引入 1. 回归定义及应用场景    ...

  7. 奈奎斯特定理、香农定理的再理解

    奈奎斯特定理.香农定理的再理解 @(计算机网络 ) 关于码元,先复习这个概念: http://blog.csdn.net/u011240016/article/details/53333682 奈奎斯 ...

  8. 动态规划的理解与案例分析

    动态规划的本质 常用的五大算法,包含 动态规划.分治法.贪心求解法.回朔法.分支限界法. 动态规划(Dynamic Programming),与其说是一种算法,不如说是一种解决问题的思路. :peac ...

  9. 【动态规划】LeetCode 53. Maximum Subarray

    LeetCode 53. Maximum Subarray 原题描述(求子序列最大和/最大子串):Find the contiguous subarray within an array (conta ...

最新文章

  1. 【Paper】2020_异构无人机编队防御及评估策略研究_左剑凯
  2. 光猫直连电脑不能上网_电脑插上网线不能上网怎么办
  3. Android根据URL下载文件保存到SD卡
  4. 零配置 之Spring基于Java类定义Bean配置元数据
  5. Python从菜鸟到高手(1):初识Python
  6. mysql 序列号生成器 (自定义函数)
  7. 阿里云不做SaaS、要练好内功被集成,发布SaaS加速器
  8. 远场语音是什么鬼?和人工智能有什么关系?
  9. C++ char,int 之间的相互转换
  10. Tenorshare iCareFone for mac如何修复iPhone手机系统?
  11. OpenCv —— 检测车牌号(附完整源码)
  12. 将系统常用程序一次性的都安装到位
  13. Struts的增删改查
  14. (简历来自拉勾)H5前端工程师:
  15. Centos7下安装yasm详细步骤
  16. ps如何把自己的图与样机结合_Ps如何套用样机图?
  17. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存
  18. 微软这个系统,90% 的人都没用过!
  19. 【Cornerstone Mac系统下的安装】
  20. C#加壳工具做代码加密保护

热门文章

  1. 转 C#对多个集合和数组的操作(合并,去重,判断)
  2. SurvivalShooter学习笔记(八.敌人管理器)
  3. Web开发入门疑问收集(不定期更新)
  4. data-role参数表:
  5. MySql命令——命令行客户机的分隔符
  6. PHP中的stdClass 【转】
  7. 实例1.2:获得应用程序主窗口指针
  8. Javascript中Date对象的使用
  9. 多项目加载顺序修改_React推出并发模式:可中断渲染、指定加载顺序、并行处理多状态...
  10. linux域文件夹权限设置密码,如何配置Linux 文件权限(经典详细版本: rwxst)