剑指 Offer 14- I. 剪绳子

原题链接:剑指 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;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值