1.题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
2.分析题目
题目看起来很简单,这是一个一维数组的动态规划。动态规划类型的题,一般要从初始条件开始看,一阶一阶地计算,这样子就会比较简单。
动态规划初始条件:一般要有两个或两个以上的初始条件。
1阶,一种方法;
2阶,两种方法;
(注意,因为这里是只有一阶和两阶的爬法,所以初始条件只有两种,如果有三阶四阶的爬法,初始化条件就应该对应有3,4种)
当有3阶的时候,你爬到第三阶,你只能是从第一阶或者第二阶爬上去的,所以第三阶的方法就是第一阶+第二阶。
以此类推,当爬到第i阶,就只能是从i-1或者i-2爬上去的。
因此我们就能得到动态规划的迭代:
dp[i] = dp[i-1] + dp[i-2];
3.代码
#include<stdio.h>
int main()
{
int dp[10000],i,n;
scanf("%d",&n);
dp[1] = 1;
dp[2] = 2;//初始化动态规划
for(i=3;i<=n;i++)
{
dp[i] = dp[i-2] + dp[i-1];
}
printf("%d\n",dp[n]);
return 0;
}
4.动态规划基本思想
(1)确定dp[i]到底是什么意思,确定状态。
(2)确定初始状态,一般是前面几个或者最后几个能够确定地得出答案,由此来推导。
(3)找到题目中的规律,得到迭代的规律。
(4)整理出代码。
这就是基本的动态规划的题的做法。