美文网首页
动态规划总结

动态规划总结

作者: GeorgeDon | 来源:发表于2019-11-19 23:03 被阅读0次
动态规划

通过子问题递推求解最优的方法, 动态规划常常适用于有重叠子问题和最优子结构性质的问题 。

解题思路

动态的规划的关键是在于如下几点

  • 确定状态 (dp[i],dp[i] [j])

  • 确定状态转移方程 dp[i] = f(dp[i-1]) ,前序已获得的状态不会影响后面的状态

  • 确定边界值

练习开始时可以通过递归加缓存的方式求解动态规划,积累到一定经验之后最好是通过确定状态转移方程来求解这类问题

一般解题模板
int[][] dp=new int[m][n]
dp[0][0]=1
for(int i=0;i<m;i++){
 for(int j=0;j<M;j++){
 dp[i][j]=f(dp[i-1][j],dp[i][j-1])+xxx
 }
} 
return dp[m-1][n-1]
常见类型
1.线性序列dp

最简单的线性的dp问题,这类问题的状态方程直接通过递推就能得到,有的时候需要通过添加状态完(某个节点的状态有几种)

https://leetcode-cn.com/problems/unique-paths/

https://leetcode-cn.com/problems/unique-paths-ii/

https://leetcode-cn.com/problems/climbing-stairs/

2.区间dp

区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。

https://leetcode-cn.com/problems/longest-palindromic-substring/ (最长回文子串,有很多解法,动态规划是比较容易理解的)

for(int len = 1;len<=n;len++){//枚举长度
   for(int j = 1;j+len<=n+1;j++){//枚举起点,ends<=n
   int ends = j+len - 1;
   for(int i = j;i<ends;i++){//枚举分割点,更新小区间最优解
   dp[j][ends] = min(dp[j][ends],dp[j][i]+dp[i+1][ends]+something);
   }
 }
3.树形dp

树形dp的数据结构有一个特点,那就是数据能够组织成一颗树,可以遍历树进行求解,遍历的方向有两个

 public int f(TreeNode root) {
     int[] res = dfs(root);
     return Math.max(res[0],res[1]);
     }
     //res[0]为不包括根节点的最大值,res[1]为包括根节点的最大值
     private int[] dfs(TreeNode root){
     int[] res = new int[2];
     if(root == null)
     return res;
     int[] left = dfs(root.left);
     int[] right = dfs(root.right); 
     res[0] = Math.max(left[0],left[1])+Math.max(right[0],right[1]);
     res[1] = left[0] + right[0] + root.val;
     return res;
     }

https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/

4.数位dp

https://leetcode-cn.com/problems/number-of-digit-one/

5.期望dp

https://leetcode-cn.com/problems/maximum-profit-in-job-scheduling/submissions/
由于数据是离散的,需要对数据先排序,然后做处理

参考

[动态规划常见的类型] https://blog.csdn.net/fjsd155/article/details/88833701

[动态规划] https://leetcode-cn.com/tag/dynamic-programming/

[区间dp入门] https://blog.csdn.net/qq_40772692/article/details/80183248

相关文章

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • 动态规划总结

    1.dp[i]表示以A[i]结尾的最值 例子1:最大连续子序列和(洛谷P3009)dp[i]=max(dp[i-1...

  • 动态规划总结

    好像理论上,都是生成一个新的数组,从前往后一步步的走,不用想太多。列出新数组第 i 个值处的推到公式(基本上会与新...

  • 动态规划总结

    动态规划 通过子问题递推求解最优的方法, 动态规划常常适用于有重叠子问题和最优子结构性质的问题 。 解题思路 动态...

  • 动态规划总结

    拉勾教育版权所有:https://kaiwu.lagou.com/course/courseInfo.htm?co...

  • 动态规划总结

    动态规划的三大步骤 动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存...

  • 动态规划例题总结

    一、01背包问题 题目描述:有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有...

  • leetcode动态规划总结

      为了准备三月份蓝桥杯的比赛和提高下自己数据结构和算法方面的水平,所以开始在leetcode上刷起了题。刚刚开始...

  • 动态规划问题总结

    动态规划学习总结 最近在学习算法,希望写一篇博客来记录自己学习过程和总结一下自己学到的东西,方便以后的归纳整理。我...

网友评论

      本文标题:动态规划总结

      本文链接:https://www.haomeiwen.com/subject/aycnictx.html