剪绳子
题目描述
给你一根长度为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。
思路分析
解法一:自下向上的动态规划。代码如下:
public int cutRope(int target) {
if(target<2)return 0;
if(target==2)return 1;
if(target==3)return 2;
int[] product=new int[target+1];
product[0]=0;
product[1]=1;
product[2]=2;
product[3]=3; //当分隔后的乘积小于该段本身时,取本身值大小
for(int i=4;i<=target;i++){
int max=0;
for(int j=1;j<=i/2;j++){
if(max<product[j]*product[i-j]){
max=product[j]*product[i-j];
}
}
product[i]=max;
}
return product[target];
}
解法二:贪婪算法:当n>=5时,尽可能多的剪长度为3的绳子,当剩下的绳子长度为4时,把绳子剪成两段长度为2的绳子。代码如下:
public int cutRope(int target) {
if(target<2)return 0;
if(target==2)return 1;
if(target==3)return 2;
int count=target/3,left=target%3,res=1;
while(count>0){
res*=3;
count--;
}
if(left==1){
res/=3;
res*=4;
}else if(left==2){
res*=2;
}
return res;
}