算法相关数据结构总结:

序号 数据结构 文章
1 动态规划 动态规划之背包问题——01背包
动态规划之背包问题——完全背包
动态规划之打家劫舍系列问题
动态规划之股票买卖系列问题
动态规划之子序列问题
算法(Java)——动态规划
2 数组 算法分析之数组问题
3 链表 算法分析之链表问题
算法(Java)——链表
4 二叉树 算法分析之二叉树
算法分析之二叉树遍历
算法分析之二叉树常见问题
算法(Java)——二叉树
5 哈希表 算法分析之哈希表
算法(Java)——HashMap、HashSet、ArrayList
6 字符串 算法分析之字符串
算法(Java)——字符串String
7 栈和队列 算法分析之栈和队列
算法(Java)——栈、队列、堆
8 贪心算法 算法分析之贪心算法
9 回溯 Java实现回溯算法入门(排列+组合+子集)
Java实现回溯算法进阶(搜索)
10 二分查找 算法(Java)——二分法查找
11 双指针、滑动窗口 算法(Java)——双指针
算法分析之滑动窗口类问题

动态规划是经典算法的一种。在算法中动态规划算法的重要性不容置疑,本博客主要是记载自己在刷题和学习过程中对动态规划的一个理解和总结。

动态规划

定义

动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。

动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。

定义比较枯燥,但却是根源。

简单来说:

  1. 拆分。把问题拆分成一步一步的可以通过递归实现的。动态规划有一类问题就是从后往前推到,有时候我们很容易知道:如果只有一种情况时,最佳的选择应该怎么做.然后根据这个最佳选择往前一步推导,得到前一步的最佳选择。
  2. 状态定义和状态与状态之间的关系。就是我们设置的动态规划列表,去表示最佳的情况。还有就是状态转移方程,该最佳状态和前状态之间的关系。
  3. 最优解。我们在保存前一状态时,可以将局部最优解存下来,后面逐步更新,可以降低时间和空间复杂度。

作用

动态规划一般用来解决:
1.计数

有多少种方式走到右下角;
有多少种方法选出k个数使得和为sum;

2.求最大值,最小值

从左上角走到右下角路径和的最大值;
最长公共子序列;
最大连续子数组和;

3.存在性

取石子游戏,先手是不是必胜;
能不能取出k个数,和为sum;

怎么用

1.确定状态(两个核心,最后一步,化成子问题)

根据最后一步,往前推。然后将问题转化成从开始到最后一步的子问题。

2.转移方程

结果=开始到最后一步+最后一步。

3.开始和边界条件

确定0,以及边界不适合转移方程的条件。

4.计算顺序

一般都是推导到从最开始计算。

整个动态规划,最难的就是定义状态。一旦状态定义出来,表明你已经抽象出子问题,可以分解原来的大问题了。

力扣关于动态规划的题

1)剑指offer47:礼物的最大价值

题目:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

解题思路:根据题目说明,易得某单元格只可能从上边单元格或左边单元格到达。

设f(i,j)为从棋盘左上角走至单元格(i,j)的礼物最大累计价值,易得到以下递推关系:f(i,j)等于f(i,j−1)和f(i−1,j)中的较大值加上当前单元格礼物价值grid(i,j)。


因此,可用动态规划解决此问题,以上公式便为转移方程。

为了提高效率,在循环外先考虑只有一行和一列的情况。

用四步法分析:

1.确定状态
1.1最后一步

无论在棋盘上怎样走到达右下角,总有挪动最后一步向右或向下。
右下角设为(m-1,n-1)
那么前一步一定是在(m-2,n-1)或(m-1,n-2)

1.2化成子问题

走到(m-2,n-1)或(m-1,n-2)的最大值
原题要求走到(m-1,n-1)的最大值
转化为子问题
状态f(i,j)为从棋盘左上角走至单元格(i,j)的礼物最大累计价值

2.转移方程

f(i,j)等于f(i,j−1)和f(i−1,j)中的较大值加上当前单元格礼物价值grid(i,j)。

3.开始和边界条件

开始:起始位置
边界条件:第一行元素和第一列元素。

4.计算顺序
从左上角开始计算。

算法代码

class Solution {public int maxValue(int[][] grid) {int m=grid.length,n=grid[0].length;for(int j=1;j<n;j++) grid[0][j]+=grid[0][j-1]; //第一行,只能从左边过来for(int i=1;i<m;i++) grid[i][0]+=grid[i-1][0]; //第一列,只能从右边过来for(int i=1;i<m;i++){ //从上或者左边过来,左边或上边的最大值加上格子值for(int j=1;j<n;j++){grid[i][j]+=Math.max(grid[i-1][j],grid[i][j-1]);}}  return grid[m-1][n-1];}
}
2)剑指offer42:连续子数组的最大和

题目:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

示例:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

解题思路
动态规划解析:

状态定义:设动态规划列表dp,dp[i]代表以元素nums[i]为结尾的连续子数组最大和。

为何定义最大和dp[i]中必须包含元素nums[i]:保证dp[i]递推到dp[i+1]的正确性;如果不包含nums[i],递推时则不满足题目的连续子数组要求。

转移方程
若dp[i−1]≤0,说明dp[i−1]对dp[i]产生负贡献,即dp[i−1]+nums[i]还不如nums[i]本身大。

初始状态:dp[0]=nums[0],即以nums[0]结尾的连续子数组最大和为nums[0]。

返回值:返回dp列表中的最大值,代表全局最大值。

算法代码

class Solution {public int maxSubArray(int[] nums) {int res=nums[0];//res存储和的最大值for(int i=1;i<nums.length;i++){nums[i]+=Math.max(nums[i-1],0);//判断加入的元素是否有贡献res=Math.max(res,nums[i]);}return res;}
}
3)剑指offer63:股票的最大利润

题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

解题思路:考虑动态规划,

状态定义:设动态规划列表dp,dp[i]代表以prices[i]为结尾的子数组的最大利润(以下简称为前i日的最大利润)。

转移方程:由于题目限定“买卖该股票一次”,因此前i日最大利润dp[i]等于前i−1日最大利润dp[i−1]和第i日卖出的最大利润中的最大值。

初始状态:dp[0]=0,即首日利润为0。

返回值:dp[n-1],其中n为dp列表长度。

时间复杂度降低:在遍历prices时,可以借助一个变量(记作cost)每日更新最低价格,优化后转移方程为:
dp[i]=max(dp[i-1],prices[i]-min(cost,prices[i]))

空间复杂度降低:由于dp[i]只与dp[i-1],prices[i],cost相关,可用一个变量(记作利润profit)代替dp列表,优化后转移方程:
profit=max(profit,prices[i]-min(cost,prices[i]))

算法代码

class Solution {public int maxProfit(int[] prices) {int cost = Integer.MAX_VALUE, profit=0;for(int price : prices){cost=Math.min(cost,price); //记录更新最小值profit=Math.max(profit,price-cost); //转移方程比较最大利润}return profit;}
}

算法(Java)——动态规划相关推荐

  1. java 动态规划视频_157-动态规划算法解决背包问题1

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  2. Java入门算法(动态规划篇2:01背包精讲)

    本专栏已参加蓄力计划,感谢读者支持❤ 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算 ...

  3. 数据结构与算法Java(二)——字符串、矩阵压缩、递归、动态规划

    不定期补充.修正.更新:欢迎大家讨论和指正 本文以数据结构(C语言版)第三版 李云清 杨庆红编著为主要参考资料,用Java来实现 数据结构与算法Java(一)--线性表 数据结构与算法Java(二)- ...

  4. java动态规划货车运输_多堆场集装箱卡车路径规划的混合蚁群算法

    多堆场集装箱卡车路径规划的混合蚁群算法 发布时间:04-15-19 张建同,宋玉坚,叶春明 <工业工程与管理>第22卷第2期 2017年4月 推荐理由 集装箱运输作为一种高效率高质量的运输 ...

  5. 视频教程-内功修炼之数据结构与算法-Java

    内功修炼之数据结构与算法 2018年以超过十倍的年业绩增长速度,从中高端IT技术在线教育行业中脱颖而出,成为在线教育领域一匹令人瞩目的黑马.咕泡学院以教学培养.职业规划为核心,旨在帮助学员提升技术技能 ...

  6. 【算法-Java实现】 换钱的方法数(暴力递归法)

    [算法-Java实现] 换钱的方法数(暴力递归法) 文章目录 [算法-Java实现] 换钱的方法数(暴力递归法) 一.问题描述: 二.问题解答: **举例:** **思路:==暴力递归==** 三.算 ...

  7. Floyd算法 Java实现

    Floyd算法 Java实现 算法导入 算法核心 代码实现 参考资料 结尾 算法导入 在上一篇博客中,咱讲述了求单源最短路径的一种经典算法 Dijkstra 算法,想了解的同学可以走前门瞅一瞅,记得回 ...

  8. 【算法】动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )

    文章目录 一.动态规划简介 二.自底向上的动态规划示例 1.原理分析 2.算法设计 3.代码示例 三.自顶向下的动态规划示例 1.算法设计 2.代码示例 一.动态规划简介 动态规划 , 英文名称 Dy ...

  9. 推特雪花算法 java实现

    2019独角兽企业重金招聘Python工程师标准>>> package twiter.snowflake;/*** twitter的snowflake算法 -- java实现*/ p ...

  10. java dh算法_dh密钥交换算法java

    dh密钥交换算法java 迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange,简称"D–H") 是一种安全协议. 它可以让双方在完全没有对方任何预先信息的 ...

最新文章

  1. 独家 | CycleGAN之美 赛马翻译成斑马背后的直觉和数学(附论文)
  2. 20155317《网络对抗》Exp4 恶意代码分析
  3. 39个超棒的免费高清专业纹理收藏集
  4. 深度学习初学者必备资料整理
  5. 深入理解 JVM Class文件格式(十)
  6. 小程序秒杀活动服务器,微信小程序官方上线张大仙周年活动,人数太多把服务器弄崩溃了...
  7. 周鸿祎:在360新员工入职培训上的讲话
  8. 山东大学 2020级数据库系统 实验七
  9. Python学习之路和隐藏特征
  10. CGRect包含交错,边缘,中心的检测
  11. JavaScript开发人员需了解的工具内容
  12. POS-商户手续费-从生活剖析,通俗易懂
  13. Visio2016下载激活破解
  14. 图书管理系统(课程设计)
  15. 使用javascript实现点击复制到剪贴板
  16. 一文让你看懂什么是嵌入式和单片机。
  17. 一个被忽视的强大搜图技能——以图搜图
  18. Digital Radiography厂家
  19. 看完这篇还不会化简卡诺图?你来打我
  20. CTF入门学习思维导图

热门文章

  1. 程序员的修炼-从优秀到卓越札记:阅读之美
  2. 国产蓝牙耳机有哪些?最好用的国产蓝牙耳机排行榜
  3. Springboot毕设项目商品报价管理53f2djava+VUE+Mybatis+Maven+Mysql+sprnig)
  4. 《企业级私有网盘系统owncloud》
  5. 假如把二维码类似的标签识别技术做成语音片段,优势劣势有哪些?
  6. optimus切换 linux,如何让NVIDIA的Optimus在Linux上工作
  7. Windows环境下用虚拟机安装使用Linux系统(下载安装CentOS7镜像+下载安装VMware+配置虚拟机和系统安装)
  8. 硕士论文中期汇报ppt_机械加工中心期末项目中期报告
  9. [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
  10. Cesium 设置实体要素闪烁