动态规划与贪婪算法(10)

题一:剪绳子

方法一:动态规划的方法。需要O(n^2)的时间和O(n)的空间

1、分析:自上而下的来进行分析,再用自下而上的方法来求解。

2、代码如下

class Solution {
public:
    int cutRope(int number) {
        if(number<=1)
            return 0;
        if(number==2)
            return 1;
        if(number==3)
            return 2;
        // product是用来保存剪之后的结果,而不是剪之前的结果
        int* product=new int[number+1];
        product[0]=0;
        product[1]=1;
        product[2]=2;
        product[3]=3;
        int max=0;
        for(int i=4;i<=number;i++)
        {
            max=0;
            // 当长度为i时,来找最大的剪法结果
            for(int j=1;j<=i/2;j++) //j表示剪的次数
            {
                if(max<product[j]*product[i-j])
                {
                    max=product[j]*product[i-j];
                }
            }
            product[i]=max;
        }
        max=product[number];
        delete[] product;
        return max;
    }
};

方法二:贪婪算法。其只需要 O(1)的时间和空间。

1、分析

当 n≥5 时,经可能多的剪长度为3的绳子;当剩下的绳子长度为4时,把绳子剪成长度为2的绳子,因为2x2>3x1,当n=4时,其实也没有必要再剪一刀。

2、代码如下:

class Solution {
public:
    int cutRope(int number) {
        if(number<=1)
            return 0;
        if(number==2)
            return 1;
        if(number==3)
            return 2;
        //经可能多的剪出长度为3的绳子
        int timesOf3=number/3;
        // 当剩余长度为4时,此时不能再剪出3,而应剪出2
        if(number-3*timesOf3==1)
        {
            timesOf3-=1;
        }
        int timesOf2=(number-3*timesOf3)/2;
        return pow(3,timesOf3)*pow(2,timesOf2);
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值