动态规划之钢条切割
动态规划的设计
1. 刻画最优解的结构特征
2. 递归地定义最优解的值
3. 计算最优解的值,通常采用自底向上的方法
4. 利用计算的信息构造一个最优解
钢条切割
不同长度的的钢条,价格不同,切割钢条使价格最高:
长度与价格相关表如下:
长度i |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
价格pi |
1 |
5 |
8 |
9 |
10 |
17 |
17 |
20 |
24 |
30 |
设有一段钢条长度为 n,求其最大的价格。
递归方法(自顶向下)
public class CutBars {
public static void main(String[] args) {
int[] p={-1, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
int count = 0;
count =cut(p, 10);
System.out.println(count);
}
public static int cut(int[] p, int n){
if(n==0){
return 0;
}
int q = -1;
for(int i = 1; i<=n; i++){
q = max(q,p[i]+cut(p,n-i));
}
return q;
}
public static int max(int a, int b){
if(a>=b)return a;
else return b;
}
}
评价:极其浪费时间做了多次的重复运算。O(2^(n-1))
自底向上动态规划方法:
public classCutBars2 {
public static void main(String[] args) {
int[] p={-1, 1, 5, 8, 9,10, 17, 17, 20, 24, 30};
int count[];
count= cut(p, 10);
for(int i: count){
System.out.println(i);
}
}
public static int[] cut(int[] p, int n){
int[] r ={0,0,0,0,0,0,0,0,0,0,0};
int q;
for(int j=1; j<=n; j++){
q= -1;
for(int i=1; i<=j; i++){
q= max(q, p[i] + r[j-i]);
}
r[j]= q;
}
return r;
}
public static int max(int a, int b){
if(a>=b)return a;
else return b;
}
}
评价:效率比较高为O(N*N)