动态规划初步

来源:互联网 发布:gson对复杂的json解析 编辑:程序博客网 时间:2024/05/16 15:58

动态规划之钢条切割

动态规划的设计

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)



0 0