题目描述
把一根绳子剪成多段,并且使得每段的长度乘积最大。
思路
1.动态规划
自顶向下分析问题,自底向上解决问题。
2.贪心(贪心这种肯定要证明的,证不出来还是算了)
代码
1.DP
public int dp(int len) {
if(len<2) return 0;
if(len==2) return 1;
if(len==3) return 2;
int[] prod = new int[len+1];
prod[0]=0;
prod[1]=1;
prod[2]=2;
prod[3]=3;
int max=0;
for(int i=4;i<=len;i++) {
max=0;
for(int j=1;j<=i/2;j++) {
int temp = prod[j]*prod[i-j];
if(temp>max) max=temp;
prod[i] = max;
}
}
return prod[len];
}
贪心
public int greedy(int len) {
if(len<2) return 0;
if(len==2) return 1;
if(len==3) return 2;
int timesOf3 = len/3;
if(len-timesOf3*3 ==1)
timesOf3--;
int timesOf2 = (len-timesOf3*3)/2;
return (int)(Math.pow(2,timesOf2)*Math.pow(3, timesOf3));
}