题目描述:
题解:
import java.util.Arrays;
public class Practice_钢条切割 {
static int[] p = {1,5,8,16,10,17,17,20,24,30};
static int n=10;
static int[] rec = new int[n+1];//记录表
static int[] vc = new int[n+1];//dp表
public static void main(String[] args) {
Arrays.fill(rec,-1);
System.out.println("最大价值为:(非记忆型递归)"+f1(n));
System.out.println("最大价值为(记忆型递归):"+f2(n));
System.out.println("最大价值为(dp):"+f3());
}
//x表示钢条长度
private static int f1(int x){
if(x==0) return 0;
int ans = 0;
int v = 0;
for(int i=1;i<=x;i++){
v = p[i-1]+f1(x-i);
ans = Math.max(ans,v);
}
return ans;
}
//记忆型递归
private static int f2(int x){
if(x==0) return 0;
int ans = 0;
int v = 0;
for(int i=1;i<=x;i++){
if(rec[x-i]==-1){
rec[x-i] = f2(x-i);
}
v = p[i-1]+rec[x-i];
ans = Math.max(ans,v);
}
rec[x]=ans;
return ans;
}
//dp
private static int f3(){
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
vc[i] = Math.max(vc[i-j]+p[j-1],vc[i]);
}
}
return vc[n];
}
}