剪绳子
题目
给你一段长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]k[1]…*k[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
思路
第一种是动态规划
自下而上
代码
public int maxProductAfterCutting(int length){
if(length<2)
{
return 0;
}
if(length==2)
{
return 1;
}
if(length==3)
{
return 2;
}
int[] products=new int[length+1];
products[0]=0;
products[1]=1;
products[2]=2;
products[3]=3;
int max=0;
for(int i=4; i<=lengh; i++){
max=0;
for(int j=1;j<=i/2;++j){
int product=products[j]*products[i-j];
if(max<product)
max=product;
products[i]=max;
}
}
max=products[length];
return max;
}
二 贪婪算法
public static int maxProductWithGreedy(int len){
if(len<2)
return 0;
if(len==2)
return 1;
if(len==3)
return 2;
//啥也不管,先尽可能减去长度为3的段
int timeOfThree=len/3;
//判断还剩下多少,再进行处理
if(len-timeOfThree*3==1)
timeOfThree-=1;
int timeOfTwo=(len-timeOfThree*3)/2;
return (int) ((Math.pow(3, timeOfThree))*(Math.pow(2, timeOfTwo)));
}