上台阶(初级)
有一楼梯共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]);
}
}