题目来源:《剑指offer》
题目描述
长度为n的绳子,把绳子剪成m(m>1)段,每段绳子的长度即为k[0],k[1],…k[m-1]。请问k[0]* k[1] * … *k[m-1]的最大乘积多少?注:每段长度都是正整数。
动态规划解法
dp[n]:长度为n的绳子剪成若干段后,各长度乘积的最大值。
在剪第一刀的时候,第一段绳子的长度可以为1,2,…,n-1。因此,dp[n] = max(dp[i] x dp[n-i]),其中 i 为 (0, n)。
- dp[2] = 1
- dp[3] = 2
int solution(int len)
{
if (len < 2) {
return 0;
}
if (len == 2) {
return 1;
}
vector<int> res(len+1);
res[0] = 0;
res[1] = 1;
res[2] = 2;
for (int n = 3; n <= len; n++) {
for (int i = 1; i <= n / 2; i++) {
int tmp = res[i] * res[n - i];
res[n] = std::max(res[n], tmp);
}
}
return res[len];
}