跳台阶问题详解---动态规划

上台阶(初级)

有一楼梯共n级,刚开始时你在第0级,若每次只能跨上一级或二级,要走上第n级,共有多少走法?

解决思路

对于这题,我们可以找规律来解答,我们先写出n=3 n=4 n=5好几项来看,不难发现这是一个斐波那契数列,

斐波那契数列到三四十左右就爆long long了  。注意范围。

当然,我们遇到复杂一些的题就不能用这样的方法了,虽然它的解题有规律,但是它的规律很难发现;

所以我们就用动态规划的方法来解题;

我们来分析一下动态规划  首先  n=1  只有一种 n=2 有两种  这没有疑问 

现在我们假设n=10,我们设爬到第九台阶的时候有F[9]中方法,到第八台阶的时候有F[8]中方法;

到第九台阶和第八台阶的方法是没有重复的,因为他们的终点不一样;

对于第九层来说,我们只需要一步就能到第十层,那么 我们有F(9)种方法到达第九层 

每种方法再走一步就到十了   所以我们就有F(9)种到达第十层的方法了

对于第八层来说,我们我们不能走一级到达9  因为这种情况已经包含在F(9)里面了(仔细想想 )

所以只能走两级 到达十 ,那么就有F(8)种方法到达十了  而F(8) F(9)不重复  所以F(8)+F(9)种方法到达十

而再往前 7 6 5...这些都需要先经过8 9 才能到  所以都已经包含在F(8) F(9)里了 

所以  最终结论就是 F(n)=F(n-1)+F(n-2)  (n>2)   F(1)=1 F(2)=2    ------也就是斐波那契数列

上台阶(升级版)

题目

一个台阶总共有n级,如果一次可以跳1级,也可以跳2级......它也可以跳上n级。此时一只青蛙跳上一个n级的台阶总共有多少种跳法?

解决思路

这一题,情况变得复杂了,所以找规律的方法已经不再适用了;

根据上边刚才的分析,我们设跳到一级有F(1)种方法,跳到二级有F(2)种方法.....F(3)...F(4).....

由题意,我们从每一级台阶都能跳到第n级,所以

F(n)=F(n-1)+F(n-2)+F(n-3).......F(1)

而 F(n-1)=F(n-2)+F(n-3)+F(n-4).......F(1)

相减得F(n)-F(n-1)=F(n-1)   ====>   F(n)=2*F(n-1);

上台阶(升级版的变式)

题目描述     

青蛙捉虫

一只青蛙,想要捕食距离它M米处的一只昆虫。
已知青蛙的蛙跳范围为[1, N]之间,单位米(每次蛙跳距离为整数,即[1,N]之间的整数)。青蛙在0的位置,求青蛙跳到M的位置吃到昆虫的方案数。    

题目分析:

我们设跳到一米有F(1)种方法,跳到二米有F(2)种方法.....F(3)...F(4).....

对于这题就与上面有些不一样了,我们现在最大只能跳N米远,所以并不是每一个F(i)都可以跳到M的;

我们对于F(i) i>=M-N  的时候才能跳到M米远;

所以 F(M)=F(M-N)+F(M-N+1)+.......+F(M-1);

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h> 
using namespace std;
const int mod=1e9+7;
int f[1007];
int main()
{
	int T;
	int m,n;
	scanf("%d",&T);
	while(T--)
	{
		memset(f,0,sizeof(f));
		scanf("%d%d",&m,&n);
		f[0]=1;
		for(int i=1;i<=m;i++)
		{
			for(int j=i-1;j>=i-n&&j>=0;j--)
			{
				f[i]=(f[i]+f[j])%mod;
			}
		}
		printf("%d\n",f[m]);
	}
}

 

 

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值