题目描述
长度为n的绳子,剪为m段,求最大乘积
动态规划
思路:
第一刀后:f(n) = f(i) * f(n-i)
- n = 2, f(2) = 1
- n = 3,f(3) = max(111, 1*2) = 2
- n = 4, f(4) = max(1111, 13, 2*2) = 4
- ···
从下到上计算,4可被分为两个2段;5可分为一个2一个3
int maxProductAfterCutting(int length)
{
if(length<=0) return 0;
int product[length+1] = {0};
int max = 0;
product[1] = 1;
product[2] = 2;
product[3] = 3;
if(length < =3) return product[length-1];
for(int i=4; i<=length; i++)
{
max = 0;
for(int j=1; j<i/2; j++)
{
int l = product[j]*product[i-j];
if(l>max) max = l;
}
product[i] = max;
}
max = product[length];
delete [] product;
return max;
}
###贪婪
贪婪策略:n>=5,尽可能剪3
int maxProductAfterCutting(int length)
{
if(length<=1) return 0;
if(length==2) return 1;
if(length==3) return 2;
if(length==4) return 4;
int three = length/3;
int other = length-three*3;
if(other==1)
{
three -=1;
}
int two = (length-three*3)*2;
return (int)(pow(3, three))*(int)(pow(2, two));
}