题解
动态规划:
- 对于任意 ,分解为 。对于任意 继续拆分后,最后都是乘积关系,所以满足无后效性,可以使用动态规划解决。
- 设 为长度为 的绳子分解最大值。
- 那么状态转移方程:
贪心:
- 其实很好发现:
- 的时候,不拆分是最好的,
- 的时候,拆分|不拆分是一样的,
- 的时候,拆分是最好的。
- 那么也就是说,最后一定会拆分的结果一定是小于等于 的。
- 对于 ,一定是拆分为 是最优解。
- 那么最后就是在 和 中选择。
- 当 时, ,那么就尽可能的按 分割。
- 最后剩下的如果是 ,就直接乘进去,如果是 ,那就取出一个 组成
AC-Code
DP:
class Solution {
public:
int cutRope(int number) {
if(number < 2) return 0;
if(number == 2) return 1;
if(number == 3) return 2;
int *dp = new int[number + 1];
memset(dp, 0, sizeof(dp));
dp[1] = 1; dp[2] = 2; dp[3] = 3;
for(int i = 4; i <= number; ++i)
for(int j = 1; j <= i / 2; ++j)
dp[i] = max(dp[i], dp[i - j] * dp[j]);
int ans = dp[number];
delete[] dp;
return ans;
}
};
贪心:
class Solution {
public:
int cutRope(int number) {
if(number < 2) return 0;
if(number == 2) return 1;
if(number == 3) return 2;
return number % 3 == 1 ? pow(3 , (number/3 - 1)) * 4 : pow(3, (number / 3)) * 2;
}
};