剪绳子
(这段时间写了很多题,剑指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];
}
};
踏踏实实搞技术,一心一意找实习