LeetCode 动态规划

 

动态规划:适用于子问题不是独立的情况,也就是各子问题包含子子问题,若用分治算法,则会做很多不必要的工作,重复的求解子问题,动态规划对每个子子问题,只求解一次将其结果保存在一张表中,从而避免重复计算。

动态规划最优化问题中的两个要素:最优子结构和重叠子问题

动态规划是以自底向上的方式来利用最优子结构,寻找问题的一个最优解需要在子问题中做出选择,即选择将用哪一个来求解问题

 

leetcode中的对应题目

1.其中dp[i]表示i节点的最终要求

  1. Climbing Stairs # step[i] = step[i - 1] + step[i - 2]

  2. Maximum Subarray

  3. House Robber #rob(i) = max(rob(i-2)+currentHouseValue,rob(i - 1))

  718.Maximum Length of Repeated Subarray //samecount [ row ] [ col]=samecount[row-1] [col-1]+1;

给定二维矩阵,矩阵中不同的整数值,找到一条最短路径,只能右、下。 https://github.com/AntonioSu/leetcode/blob/master/problems/64.MinimumPathSum.md

2.背包问题——下标具有意义

322.Coin Change 二维数组V(i,j):前 i 个物品,背包容量 j,所能取得的最大价值。 1) j<w(i) V(i,j)=V(i-1,j) //如果当前容量小于第i个物品的重量,则不会装入此物品,

故而最大价值仍然为V(i-1,j) 2) j>=w(i) V(i,j)=max{ V(i-1,j),V(i-1,j-w(i))+v(i) }//表示装入物品,但同时需要预留w[i]空间,才可装入当前物品,但是装入不一定价值最大,所以需要比较

https://github.com/AntonioSu/leetcode/blob/master/problems/322_Coin_Change.md

3.dp[i] [j]表示i,j之间具有的最值

https://github.com/AntonioSu/leetcode/blob/master/problems/312.BurstBalloons.md

4.dp[i] [j]表示只是记录中间结果,最值不在数组中,需要保存一个max,或者min

https://github.com/AntonioSu/leetcode/blob/master/problems/221.MaximalSquare.md

https://github.com/AntonioSu/leetcode/blob/master/problems/85.MaximalRectangle.md

5.符合特定条件的转移方程 https://github.com/AntonioSu/leetcode/blob/master/problems/72.EditDistance.md

 

 

分治算法:https://www.cnblogs.com/AntonioSu/p/11865159.html

贪心算法:https://www.cnblogs.com/AntonioSu/p/11865139.html

posted @ 2019-11-15 09:53  suwenyuan  阅读(165)  评论(0编辑  收藏  举报