【剑指offer】——剪绳子

剪绳子

在这里插入图片描述
(这段时间写了很多题,剑指offer快写完了,算法我真的…看到算法题就不想写,但是想了下,觉得自己不能一直这么逃避,该学的还得学,过程总是要经历的,就看了道关于动态规划的题)

思路:当绳子的长度小于2的时候,就返回0;绳子长度等于2时,返回1(1x1=1);当绳子长度等于3,返回2(1x2=2);设dp[1]=1,dp[2]=2,dp[3]=3,(注意,这个数组不包含前面几种情况)剩下的情况就是大于等于4,小于等于n的,每次都取一个最优解,什么意思?假设n==4,那我们绳子长度为4,且乘积最大的,如下:
1+3=4,res=dp[1]*dp[4-1]==3;
2+2=4;res=dp[2]*dp[4-2]==4; res>3(上一次的结果),res=3
超过4的一半,就是重复的,退出循环,所以dp[4]=3;将最后dp[4]返回
贴个过了的代码,自行体会下:

class Solution 
{
public:
    int cutRope(int number) 
    {
        if(number<2)
            return 0;
        if(number==2)
            return 1;
        if(number==3)
            return 2;
        int *dp=(int*)malloc(sizeof(int)*(number+1));
        memset(dp,0,sizeof(int)*(number+1));  //初始化全为0
        int res=0;
        dp[1]=1;
        dp[2]=2;
        dp[3]=3;
        for(int i=4;i<=number;i++)
        {
            for(int j=1;j<=i/2;j++)
            {
               res=max(res,dp[j]*dp[i-j]);
            }
            dp[i]=res;
        }
         return dp[number];       
    }
};

踏踏实实搞技术,一心一意找实习

原创文章 78 获赞 21 访问量 3521

猜你喜欢

转载自blog.csdn.net/Vicky_Cr/article/details/105814119