matrix上的下楼梯问题

Description

XiaoMi walks down stairs from two floors. There are hs

0<h<20,0<s<20

How many schemes are there for downstairs?

Input

Two num: h,s

Output

The number of schemes.

Sample Input

1 3

Sample Output

1

题目叙述如上,刚拿到此题时丝毫没有头绪,遂上网搜索下楼梯递归,得到下楼梯的最初始的题目:

爬楼梯问题,n阶楼梯,一次迈一步或者两步。一共有几种方法?

此题的思路为:

(1)直接思考:设f(x)=【剩x阶时,迈楼梯的方法总数】。首先迈出第一步,如果一次迈一阶,剩下x-1阶,方法总数为f(x-1);如果一次迈两阶,剩下x-2阶,方法总数为f(x-2);这里f(x-1) f(x-2)都是我们不知道的。这里只是找出一个递推关系式。即f(x)=f(x-1)+f(x-2)。容易发现,f(1)=1,f(2)=2。

(2)通过不断举例来找到规律:

如果x为1时,只可以迈一步,共有一种方法。
如果x为2时,可以一次迈一步,也可以一次迈两步,共有两种方法。
如果x为3时,可以先1,后2;可以先2,后1;也可以1,1,1;共有三种方法。满足f(1)+f(2)。
如果x为4时,1,1,1,1;    1,2,1;    1,1,2;    2,1,1;    2,2;   共有五种方法。满足f(2)+f(3)。
......
发现规律:f(x)=f(x-2)+f(x-1);

总结:
做递归函数时,我们不妨先从较小的数开始做实验,找出潜在的数学规律,抽象成数学问题。【即找出递推关系式】。这样比直接思考问题要简单一些。

实现代码如下:

#include <stdio.h>
int f(int x){
 if(x==1)
     return 1;
    if(x==2)
        return 2;
    return (f(x-1)+f(x-2));
}
int main(){
 int n;
 scanf("%d",&n);
 printf("%d",f(n));
 return 0;
}

 

现在回到matrix上的题目,发现下楼梯的阶数从1到2阶变成1到s阶,以相同的思路来思考:

首先迈出第一步,如果一次迈一阶,则方法总数为f(h-1);

                          如果一次迈两阶,则方法总数为f(h-2);

                          如果一次迈三阶,则方法总数为f(h-3);

                          ⋯⋯

                          如果一次迈s阶,则方法总数为f(h-s);

于是想到通过循环来实现这一过程:

int sum=0;

for(int i;i<=s;i++)

sum=sum+f(h-i);

现在开始寻找递归结束的条件:

当h-i<0时,方法数为0;

当h-i=0时,方法数为1(一次走完所有楼梯);

当h-i=1时,方法数也为1(两次走完所有楼梯,且其中一次是走一阶);

由此,我们可以写出函数:

int f(int h,int s)

{ int sum=0;

if(h<0) return 0;
else if(h==0) return 1;
else if(h==1) return 1;
else{
for(int i=1;i<=s;i++)
{
sum=f(h-i,s)+sum;
}
return sum;

}

}

 

此题主要部分完成,接下来实现main函数即可.

本题代码如下:

#include<stdio.h>
int f(int a,int b)
{ int sum=0;
if(a<0) return 0;
else if(a==0) return 1;
else if(a==1) return 1;
else{
for(int i=1;i<=b;i++)
{
sum=f(a-i,b)+sum;
}
return sum;}
}
int main()
{
int h,s;
scanf("%d%d",&h,&s);
printf("%d\n",f(h,s));
return 0;
}

 

 

原题及思路和解答来自http://blog.renren.com/share/273685802/11043344928

十分感谢.

                     




 
posted @ 2018-11-17 12:26  CrossingX  阅读(371)  评论(2编辑  收藏  举报