给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
思路:动态规划,设置f(n)为长度为n的绳子能剪出来的最大值。
而且题目要求绳子的长度必须是整数,必须剪一次。那么要额外写绳子长度n=1,2,3的情况。因为1没办法剪,而2,3只有一种剪法。
public class Main {
public int cutRope(int target) {
if(target<2){
return 0;
}
if(target==2){
return 1;
}
if(target==3){
return 2;
}
int[] f=new int[target+1];
f[0]=0;
f[1]=1;
f[2]=2;
f[3]=3;//这些是用来计算的,不是说绳子长度能剪出来的最大值
//i是绳子的长度,长度的遍历从4开始
for(int i =4;i<=target;i++){
//max记录当绳子长度为i时,能剪出来的最大值
int max=0;
for(int j=1;j<=i/2;j++){
int num=f[j]*f[i-j];
max=Math.max(num,max);
}
f[i]=max;
}
return f[target];
}
}