一、题目与分析
一只青蛙跳n个台阶,一次可以跳一阶,一次也可以跳两阶,问一共有多少种跳法。
这显然是动态规划中的计数问题。
我们按照DP步骤来一步一步分析:
1 确定状态
1.1.研究最后一步
一共n阶台阶,青蛙的跳法为最后一次跳了1阶加上前n-1阶的跳法,与最后一次跳了2阶加上前n-2阶的跳法。
1.2.化为子问题
x阶台阶有多少种跳法
2 转移方程
f[n] = f[n-1]+f[n-2]
3 初值和边界
3.1 初值
f[0] = 0;
f[1] = 1;
f[2] = 2;
3.2 边界
输入的n需要大于2。
4 计算顺序
从小至大。
二、代码
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
//1.1确定状态f[n] = n个台阶需要的走法
//最后一步走1或者2,
//1.2子问题:x个台阶需要的走法
//2.1 转移方程f[n] = f[n-1] + f[n-2]
//3.1 初值
//f[0] = 0
//f[1] = 1
//f[2] = 2
//3.2 边界条件
//f[n],n不可为负数。
//4 计算顺序:从小至大。
int frog_jump_DPversion(int n)
{
if (n < 0)
{
cout << "输入不合法,请输入正整数!" << endl;
return -1;
}
if (n == 0)
{
return 0;
}
if (n == 1)
{
return 1;
}
if (n == 2)
{
return 2;
}
vector<int> f(n + 1);
f[0] = 0;
f[1] = 1;
f[2] = 2;
for (int i = 3; i <= n; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
int main()
{
cout << frog_jump_DPversion(15);
}