1. DP算法定义:

每次决策依赖于当前状态,又随即引起状态的转移,多阶段最优化决策解决问题的过程就称为动态规划。

2. DP算法基本流程:

初始状态→│决策1│→│决策2│→…→│决策n│→结束状态

1、划分:按照问题的特征,把问题分为若干阶段。注意:划分后的阶段一定是有序的或者可排序的

2、确定状态和状态变量:将问题发展到各个阶段时所处的各种不同的客观情况表现出来。状态的选择要满足无后续性

3、确定决策并写出状态转移方程:状态转移就是根据上一阶段的决策和状态来导出本阶段的状态。根据相邻两个阶段状态之间的联系来确定决策方法和状态转移方程

4、边界条件:状态转移方程是一个递推式,因此需要找到递推终止的条件

DP算法实现三要素:

1、问题的阶段

2、每个阶段的状态

3、相邻两个阶段之间的递推关系

确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。

例如:f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}

3. DP常见问题:

1、找零钱问题

  有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。给定数组penny及它的大小(小于等于50),同时给定一个整数aim,请返回有多少种方法可以凑成aim。

测试样例:
penny=[1,2,4]

penny_size=3

aim = 3
返回:2
即:方案为{1,1,1}和{1,2}两种

分析:

  设dp[n][m]为使用前n中货币凑成的m的种数,那么就会有两种情况:

使用第n种货币:dp[n-1][m]+dp[n-1][m-peney[n]]

不用第n种货币:dp[n-1][m],为什么不使用第n种货币呢,因为penney[n]>m。

这样就可以求出当m>=penney[n]时 dp[n][m] = dp[n-1][m]+dp[n][m-peney[n]],

  否则,dp[n][m] = dp[n-1][m]。

import java.util.*;
public class Exchange {  public int countWays(int[] penny, int n, int aim) {  // write code here  if(n==0||penny==null||aim<0){  return 0;     }  int[][] pd = new int[n][aim+1];  for(int i=0;i<n;i++){  pd[i][0] = 1;     }  for(int i=1;penny[0]*i<=aim;i++){  pd[0][penny[0]*i] = 1;     }  for(int i=1;i<n;i++){  for(int j=0;j<=aim;j++){  if(j>=penny[i]){  pd[i][j] = pd[i-1][j]+pd[i][j-penny[i]];  }else{  pd[i][j] = pd[i-1][j];  }  }  }  return pd[n-1][aim];  }

2、走方格问题

有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。
给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.
测试样例:
[[1,2,3],[1,1,1]],2,3
返回:4

解析:设dp[n][m]为走到n*m位置的路径长度,那么显而易见dp[n][m] = min(dp[n-1][m],dp[n][m-1]);

import java.util.*;
public class MinimumPath {  public int getMin(int[][] map, int n, int m) {  // write code here  int[][] dp = new int[n][m];  for(int i=0;i<n;i++){  for(int j=0;j<=i;j++){  dp[i][0]+=map[j][0];      }  }  for(int i=0;i<m;i++){  for(int j=0;j<=i;j++){  dp[0][i]+=map[0][j];      }  }  for(int i=1;i<n;i++){  for(int j=1;j<m;j++){  dp[i][j] = min(dp[i][j-1]+map[i][j],dp[i-1][j]+map[i][j]);     }  }  return dp[n-1][m-1];  }  public int min(int a,int b){  if(a>b){  return b;     }else{  return a;     }  }

动态规划DP算法理解相关推荐

  1. 动态规划算法python_动态规划——DP算法(Dynamic Programing)

    一.斐波那契数列(递归VS动态规划) 1.斐波那契数列--递归实现(python语言)--自顶向下 递归调用是非常耗费内存的,程序虽然简洁可是算法复杂度为O(2^n),当n很大时,程序运行很慢,甚至内 ...

  2. c语言dp算法,C++动态规划dp算法题

    问题1:找硬币,换钱的方法 输入: penny数组代表所有货币的面值,正数不重复 aim小于等于1000,代表要找的钱 输出: 换钱的方法总数 解法1:经典dp,空间复杂度O(n*aim) class ...

  3. 蓝桥杯备考-刷题之路-动态规划算法(DP算法)Part1

    之前在刷力扣的时候就是浑浑噩噩的,照着评论区的答案写了一遍就万事大吉了,没有深度思考过.这次备考蓝桥杯看到DP算法的第一道题就不会,更难受的是看答案了依然完全不理解,所以决心把DP算法一次弄懂. 开始 ...

  4. dp笔记:关于DP算法和滚动数组优化的思考

    从网上总结了一些dp的套路以及对滚动数组的一些思考,现记录如下,希望以后回顾此类算法时会有所帮助. 目录 1.DP算法经验 1.DP算法核心: 2.DP算法类别以及例题 例1:三步问题 例2:最小路径 ...

  5. 第十四周DP算法总结

    这周自己主要再看DP算法的博客,感觉DP这一部分内容确实比之前的都要麻烦一些,最后攻克这一部分难题还是挺好的. 这周自己总结了一些题型,以及一些方法思路,最后再把动态规划和之前的分治和贪心做一下比较. ...

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

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

  7. 动态规划(DP)的整理-Python描述

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

  8. 动态规划算法分析和理解:最长公共子序列、公共子字符串

    定义啥的就不多说了,反正我有自己的理解就行.例题是,最长公共子序列和最长公共子字符串的动态规划求解过程 目录 一.递归和动态规划 二.动态规划求解步骤 三.最长公共子序列 四.最长公共子字符串 一.递 ...

  9. 动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包

    动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包 01背包 && 完全背包 && 分组背包 の 视频教程:https://www.bilibi ...

最新文章

  1. 腾讯杰出科学家写给2029的信:计算机视觉AI技术的爆点在哪里?
  2. Unity3d 去掉exe版本的边框
  3. 什么是51%算力攻击?——区块链系列学习笔记
  4. 无法安装php-fpm,PHP编译安装后无法启动PHP-FPM
  5. python标准库time_python标准库介绍——12 time 模块详解
  6. MyEclipse中的ant初识
  7. 华中科技大学计算机组成原理教材,2017华中科技大学《计算机组成原理》考研套装资料...
  8. word中批量调整图片大小的方法
  9. microhard PICO900(P900)电台配置
  10. 阿里巴巴的安全能力究竟是什么水平?
  11. 2017年ACM第八届山东省赛I题: Parity check(判断 第n项斐波那契数列奇偶性)
  12. 遥想大肠包小肠----python装饰器乱弹
  13. 蒙特卡洛树搜索(MTCS)
  14. Redis使用入门(二)【Windows下Python客户端redis-py使用】
  15. 小米软件开发二面和中兴软开一面
  16. Python HackerRank 刷题 Maximum Subarray Sum
  17. CSS实现核辐射警告标志
  18. ExcelUtils工具类(Java,poi)
  19. 阿里云服务器安装mysql8
  20. IOS核心动画高级五:变换

热门文章

  1. c语言游戏 人物素材,代码女神编写的C语言版本扫雷游戏,场面失控,速来围观...
  2. 使用matplotlib.pyplot,pyecharts和seaborn画过的图
  3. AutoCAD单独卸载,不影响其他软件,CAD 2021安装失败,怎么完全彻底卸载删除清理干净CAD 2021各种残留注册表和文件?
  4. 神经网络 neural network
  5. javamail——邮件发送
  6. Lombok报: @Builder 实际参数列表和形式参数列表长度不同
  7. 华纳云香港机房CN2线路服务器测评,去程电信CN2联通移动直连,回程CN2+AS4837
  8. 解决新能源汽车充电桩数量不足和充电时间过长的问题的思路
  9. 【LeetCode Python实现】658. 找到 K 个最接近的元素(中等)
  10. Java程序员进阶架构师推荐阅读书籍