【剑指offer】【贪心】14-I. 剪绳子

题目链接:https://leetcode-cn.com/problems/jian-sheng-zi-lcof/

贪心

class Solution {
public:
    int cuttingRope(int n) {
        if(n <= 3) return 1 * (n - 1);
        
        int res = 1;
           
        if(n % 3 == 1)  res = 4, n -= 4;
        else if(n % 3 == 2) res = 2, n -= 2;
        while(n) res *= 3, n -= 3;
        return res;
    }
};

动态规划

dp[i]表示长度为i的绳子的最大乘积;
dp[i] = j * (i - j);
有四种情况:

都拆开 dp[i] = dp[j] * dp[i - j];
j可以拆开 dp[i] = dp[j] * (i - j);
i - j 可以拆开 dp[i] = j * dp[i - j];
都拆开 dp[i] =j * (i - j)

class Solution {
public:
    int cuttingRope(int n) {
        vector<int> dp(n + 1, 0);
        dp[2] = 1;
        for(int i = 2; i <= n; i++)
        {
            for(int j = 0; j < i; j++)
            {
                dp[i] = max(dp[i], max(dp[j], j) * max(dp[i - j], i - j));
            }
        }
        return dp[n];
    }
};
posted @ 2020-05-08 19:23  NaughtyCoder  阅读(84)  评论(0)    收藏  举报