题目传送门
题解
动态规划:
- 对于任意
,分解为
。对于任意
- 设
为长度为
- 那么状态转移方程:
贪心:
- 其实很好发现:
- 那么也就是说,最后一定会拆分的结果一定是小于等于
- 对于
,一定是拆分为
- 那么最后就是在
和
- 当
时,
,那么就尽可能的按
- 最后剩下的如果是
,就直接乘进去,如果是
,那就取出一个
组成
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;
}
};