原题链接:剑指 Offer 14- I. 剪绳子
solution:
动态规划:
状态表示:dp[i]表示长度为i的绳子分段后乘积的最大值
长度为i的绳子可以减成 j 和 i - j两段,此时可以分成两种情况:
① i - j 不继续减,因此dp[i] = max(dp[i], j * (i - j));
② i - j 继续减,因此dp[i] = max(dp[i], j * dp[i - j]);
因此得出转移方程:
dp[i] = max(dp[i], j * max(dp[i - j], i - j));
- class Solution {
- public:
- int cuttingRope(int n) {
- if(n == 2) return 1;
- if(n == 3) return 2;
-
- vector<int> dp(n + 1); //dp[i]表示长度为i的绳子剪完后各段乘积的最大值
-
- for(int i = 1;i <= n;i++) {
- for(int j = 1;j < i;j++) {
- dp[i] = max(dp[i], j * max(dp[i - j], i - j)); //转移方程
- }
- }
- return dp[n];
- }
- };
贪心:
尽可能多的减长度为3的绳子。
- class Solution {
- public:
- int cuttingRope(int n) {
- if(n <= 3) return n - 1; //特殊情况
-
- int res = 1;
- while(n > 4) {
- res *= 3;
- n -= 3;
- }
- return res * n;
- }
- };