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

题一:剪绳子

动态规划与贪婪算法(10)_第1张图片

方法一:动态规划的方法。需要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

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

1、分析

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

动态规划与贪婪算法(10)_第2张图片

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);
    }
};

 

你可能感兴趣的:(剑指Offer)