【解题思路】
题目中绳子的长度n大于2,绳子至少可以剪一刀。当n = 2时,只能剪一刀,2 = 1 + 1,此时乘积为1 * 1 = 1;
当n = 3时,3 = 1 + 1 + 1,此时1 * 1 * 1 = 1;3 = 1 + 2,此时1 * 2 = 2,最大为2;
当n = 4时,4 = 1 + 1 + 1 + 1,此时 1 * 1 * 1 * 1 = 1; 4 = 1 + 2 + 1,此时1 * 2 * 1 = 2;4 = 2 + 2,此时2 * 2 = 4;4 = 1 + 3,此时1 * 3 = 3;最大为4。
求长度为n的绳子,分为m段,每段乘积的最大值的问题,可以转换为在i点剪开,f(i) * f(n-i)的最大值的问题。 将原问题转换为规模较小的子问题,构造动态规划表达式为:f(n) = max{f(n), f(i) * f(n-i)}。
class Solution {
public int cuttingRope(int n) {
if(n == 2) return 1;
if(n == 3) return 2;
int[] f = new int[n+1];
f[0] = 0;
f[1] = 1;
f[2] = 2;
f[3] = 3;
int tmp = 0;
for(int i = 4; i <= n; i++)
{
for(int j = 1; j <= i/2; j++)
{
tmp = f[j] * f[i-j];
if(tmp > f[i])
{
f[i] = tmp;
}
}
}
return f[n];
}
}