一、斐波那契数列(考点:递归与循环)
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
解题思路:F(0)=0,F(1)=1,F(2)=F(1)+F(0),F(3)=F(2)+F(1)。...........
class Solution {
public:
int Fibonacci(int n) {
//递归出口
if(n==0|n==1)
return n;
int a=0,b=1,result=0;
for(int i=2;i<=n;i++)
{
result=a+b;
a=b;
b=result;
}
return result;
}
};
二、三、四、五、剪绳子(考点:动态规划、贪婪算法)
题目:给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
解题思路:动态规划思路。首先这是一个求解最优化的问题,应抽象出最小的问题解,即绳子长度小于2时解为0,绳子长度为2时解为1,绳子长度为3时解为2.以此类推,可得到求解方法。
class Solution {
public:
int cutRope(int number) {
if(number<2)
return 0;
if(number==2)
return 1;
if(number==3)
return 2;
int* count=new int[number+1];
count[0]=0;
count[1]=1;
count[2]=2;
count[3]=3;
int max=0;
for(int i=4;i<=number;i++)
{
max=0;
for(int j=1;j<=number/2;j++)
{
int counter=count[j]*count[i-j];
if(counter>max)
max=counter;
count[i]=max;
}
}
max=count[number];
delete[] count;
return max;
}
};