算法 动态规划 【青蛙跳台阶DP版】

71 篇文章 12 订阅
41 篇文章 1 订阅

一、题目与分析

一只青蛙跳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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值