题一:剪绳子
方法一:动态规划的方法。需要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);
}
};