动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。
动态规划的重点在于用表存储子子问题的解,使得每个子子问题只用求解一次,避免重复计算。(空间换时间)
动态规划通常用来求解最优化问题
动态规划两个特征
1.子问题重叠
2.最优子结构
四个步骤来设计一个动态规划算法
1.刻画一个最优解的结构特征(寻找最优子结构,然后利用这种子结构从子问题的最优解构造出原问题的最优解)
2.递归的定义最优解的值
3.计算最优解的值,通常采用自底而上的方法
4.利用计算出的信息构造最优解
LeetCode的最长回文子串问题就是用到了动态规划
15.1钢条切割问题
给定一段长度为n英寸的钢条和一个不同长度钢条价目表pi(i=1,2,...,n)求切割方案
最优解是把可以迭代原钢条切成两段的最大值来做到,但是如果可以把一段钢条切割最大值存起来,下次调用它的时候就不用再迭代了。时间复杂度就从O(2^n)变为O(n^2)。
钢条切割问题满足最优子结构性质:问题最优解由相关子问题的最优解构成,而这些子问题可以单独求解。
提到这点是因为有时最优解不是由相关子问题的最优解构成。
以下是解决这个问题的代码:允许设置钢条切割费用,返回割切后各钢条长度
package cutSteel;
import java.util.*;
public class cutSteel {
public static void main(String[] args) {
int steelLength = 15;//steelLength为原钢条长度
int cutPay =