有这么一题
有一个楼梯总共n个台阶,只能往上走,每次只能上1个、2个台阶,总共有多少种走法。
小牛的程序员想了想:
解决方案:
dp[n] 表示n个台阶的走法,那么有:
dp[n]=dp[n-1]+dp[n-2];
dp[1]=1;dp[2]=2;
这能难到我,
int stepNumer(int n)
{
if (n < 3)
return n;
else
return stepNumer(n - 1) + stepNumer(n - 2);
}
大神级别的程序员来了
一看,随着n数一直增长,大量重复的计算,使得复杂度呈指数爆炸增长。
你的递归算法,时间复杂性,随着n的增加,一直爆表。
看我的,动态规划的算法 通过牺牲空间复杂度来换取时间复杂度的降低。
int stepNumer(int n)
{
int step1 = 1;
int step2 = 2;
int stepN = 0;
for (int i = 2;i < n;i++)
{
tempN = step1 + step2 ;
step1 = step2 ;
step2 = tempN ;
}
return n<3?n:tempN;
然后点评了一下:每个f(n)只需计算一次然后记录下来,避免了大量重复的计算
动态规划通过牺牲空间复杂度来换取时间复杂度的降低,单大多情况下牺牲是值得的。
小子你的算法不错,不过还是嫩了点,再好好干几年,修行一下。
然后满意的走了,一天的心情很是高兴。
突然有一天,在地摊卖菜,原本是数学系,出了社会没找到工作,看到这题,不懂代码,随手写了写。
dp[n]=dp[n-1]+dp[n-2];
dp[1]=1;dp[2]=2;
根据f(n)=f(n-1)+f(n-2),推出特征方程
x 2 = x + 1 ; x^2=x+1; x2=x+1;
( x − 1 2 ) 2 = 5 4 (x-\frac{1}{2})^2=\frac{5}{4} (x−21)2=45
推出两值: x 1 = 1 + 5 2 , x 2 = 1 − 5 2 x_1=\frac{1+\sqrt{5}}{2},x_2=\frac{1-\sqrt{5}}{2} x1=