动态规划解决

剪绳子

http://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8

class Solution {
public:
    int cutRope(int number) {
        //选取剪绳子的第一段的长度,计算出其最大乘积长度,然后乘以剩余一段的最大乘积长度
        //以选出最终的最大乘积长度,每一分割绳子段都是先前过程中计算出来的
        //由于已知n>0,m>0,则可以知道绳子必须进行分割,然后建立辅助vector,注意下标的关系
        //当number<2时,并不满足题意,返回0
        if (number < 2)
            return 0;
        //当number==2时,
        else if(number==2)
            return 1;
        else if(number == 3)
            return 2;
        //当number>=4的时候
        //则要进行辅助空间的定义
        vector<int> dp(number+1,0);
        dp[0] = 0;
        dp[1] = 1;//剪绳子的第一段都是从1开始的
        dp[2] = 2;//代表第一段绳子长度为2,而并不是上面进行返回的最大乘积
        dp[3] = 3;//代表第一段绳子长度为3,而不是上面进行返回的最大乘积
        for(int i=4;i<=number;i++){
            int max=0;
            //限制条件为j<=number/2的原因为:如果第一段选取的绳子的长度大于了number的一半
            //则将会与先前进行分割的情况重复
            for(int j=1;j<=number/2;j++){
                max=dp[j]*dp[i-j]>max?dp[j]*dp[i-j]:max;
            }
            dp[i]=max;
        }
        return dp[number];
    }
};
全部评论
请问vector<int> dp(number+1,0);为什么是number+1?这样处理有什么好处吗?</int>
点赞 回复 分享
发布于 2021-02-23 21:08

相关推荐

评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务