问题:
有一个长度为n的钢条,还有一个长度为n的价格表,此表对应钢条长度1至n对应的价格,如何切割钢条能得到最大的收益?
解:
法1:
//原始的递归方法解决
public static int getprice(int[]p,int n){
if(n==0){
return 0;
}
int q =-1;
for(int i = 0;i<n;++i){
q=Math.max(q,p[i]+getprice(p,n-i-1));
}
return q;
}
法2:
//切割问题DP,自顶向下递归实现
public static int temp(int[]p,int n){
int[] q = new int[n+1];
for(int i =0;i<n+1;++i){
q[i]=-1;
}
return getprice2(p,n,q);
}
public static int getprice2(int[]p,int n,int[]r){
if(r[n]>=0){return r[n];}
if(n==0){
return 0;
}
int q =-1;
for(int i = 0;i<n;++i){
q=Math.max(q,p[i]+getprice2(p,n-i-1,r));
}
r[n] = q;
return q;
}
法3:
对于这个传入的p,价格从索引1开始,索引0可以填个-1.
//切割问题DP, 自底向上版本
public static int getprice3(int[]p,int n){
int[] r = new int[n+1];
for(int i=0;i<n+1;++i){
r[i]=-1;
}
r[0] = 0;
for(int j=1;j<=n;++j){
int q =-1;
for(int i=1;i<=j;++i){
q=Math.max(q,p[i]+r[j-i]);
}
r[j]=q;
}
return r[n];
}