题目来源:剑指offer
给你一根长度为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.
思路:1.动态规划,状态转移方程为f(n)=max(f(i)*f(n-i)),自底向上
2.贪心(需要数学证明贪心策略可以取到最优解,不具有通用性),这道题在n>5的情况下2(n-2)>n,3(n-3)>n
并且2(n-2)<3(n-3)
public class J_JianShengZi {
public int maxCutting(int length){
if (length<2)
return 0;
if (length==2)
return 1;
if (length==3)
return 2;
//int res=0;
int dp[]=new int[length+1];
dp[0]=0;
dp[1]=1;
dp[2]=1;
dp[3]=2;
for (int i=4;i<=dp.length;i++)
{
int max=0;
for (int j=1;j<=2/i;j++){
int p=dp[j]*dp[i-j];//
if (max<p)
max=p;
dp[i]=max;
}
}
return dp[length];
}
//贪心算法,尽可能多的选取3
public int maxCutTanxin(int length){
if (length<2)
return 0;
if (length==2)
return 1;
if (length==3)
return 2;
int timesOf3=length/3;
//当绳子的长度剩余未4的时候此时更好的办法建成长度为2的两段,因为2*2>3*1
if (length%3==1)
timesOf3-=1;
int timesOf2=(length-timesOf3*3)/2;
return (int)(Math.pow(3,timesOf3))*(int)(Math.pow(2,timesOf2));
}
}