动态规划使用条件:原始最优解问题可以基于子问题的最优解求的,而且子问题被重复递归求解。
特点:
1 :具有最优子结构
2: 重叠子问题求解
钢条割据案例:
代码参考:
package com.ljh; public class DongTai001 { //钢条割据问题 public static void main(String args[]){ int [] p = {1,5,8,9}; System.out.println(buttom_up_cut(p)); } //p[]表示钢条价格表 private static int buttom_up_cut(int []p){ int remenber[] = new int[p.length+1]; //加一是因为p[]的下标是从0到n-1,而remenber[]的下标是从1-n存储对应的钢条最优价格的表 for(int i = 1;i <= p.length;i++){ int q = -1; i代表当前的钢锯条的长度,此循环求解i长度的钢锯的最优价格的值,然后存入下标为为i的remenber[i] for(int j = 1; j<=i;j++){ //表示当前分割方式下,第一段的价格+剩余长度的最优价格=此种分割方式的最高价格 q = Math.max(q,p[j-1]+remenber[i-j]); } remenber[i] = q;//保存当前长度的最优解 } return remenber[p.length];//返回最后的求解结果 } }