LeetCode-剑指 Offer 14- I. 剪绳子

思路一:动态规划

1:首先我们想要求长度为n的绳子剪掉后的最大乘积,可以从前面比n小的绳子转移而来

2:用一个dp数组记录从0到n长度的绳子剪掉后的最大乘积,也就是dp[i]表时长度为i的绳子剪成m段后的最大乘积,初始化dp[2]=1

3:我们把绳子剪掉第一段(长度为j),如果只减去1,对最后的乘积没有任何增益,所以长度为2开始剪

4:剪了第一段后,剩下(i-j)长度可以不剪。如果不剪对应j*(i-j);如果剪去对应j*dp[i-j]。取两者最大值max(j*(i-1),j * dp[i-j])

5:第一段长度j可以取的区间为[2),对所有j不同的情况取最大值,因此最终dp[i]的转移方程为dp[i] = max(dp[i],j*max(dp[i-j],(i-j)))

class Solution {
public:
    int cuttingRope(int n) {
        if(n<2) return  0;
        vector<int> dp(n+1);//当绳子长度为i时候可能的最大乘积为dp[i]
        //确定初始化条件
        dp[2]=1;   //0跟1减没有意义
        for(int i=3;i<=n;i++){
            for(int j=2;j<i;j++){   //j表示剪下来的绳子大小,当剪下1时候没意义,所以从2开始
                //绳子有两种方式,一种是剪下之后,剩下的再剪下最大为j*dp[i-j]
                //一种是剪下之后,剩下的不减了,剩的为j*(i-j);
                dp[i] = max(dp[i],j*max(dp[i-j],(i-j)));  //里面一直跟之前的遍历减过的结果比较   
            }
        }

        return dp[n];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值