剪绳子
题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),
每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度
是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
1. 迭代求解
长度为n的绳子最多可以剪n-1次。如果剪一次将绳子分为长度分别为i和n-i的两段,得到的长度为i*(n-i);
public static int maxCut2(int length) {
int f = 0;
//*
*当某一段绳子的长度小于4,此时不需要对这段绳子再分段,或者说不分段所得到的结果才是最大的。
*这与长度为3的绳子可以得到的最大值2;长度为2的绳子可以得到的最大值1不同。
if (length<=4) {
return length;
}
//剪绳子的对称性,不需要从1遍历到length
for (int i=1;i<length/2+1;++i) {
f=Math.max(f,i*maxCut2(length-i));
}
return f;
}
public static int maxCut1(int i) {
switch (i) {
case 1:
return 0;
case 2:
return 1;
case 3:
return 2;
default:
return maxCut2(i);
}
}
public static void main(String[] args) {
System.out.println(maxCut1(15));
}
2. 尽可能多的划分长度为3的段,同时不出现长度为1的段
public static int maxCut3(int target) { int f = 1; int timeof3 = target/3; if (target-timeof3*3==1) { timeof3--; f = 4; } if (target-timeof3*3==2){ f= 2; } return (int) Math.pow(3,timeof3)*f; } public static void main(String[] args) { System.out.println(maxCut3(10)); }

浙公网安备 33010602011771号