matrix上的下楼梯问题
Posted crossingx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matrix上的下楼梯问题相关的知识,希望对你有一定的参考价值。
Description
XiaoMi walks down stairs from two floors. There are hhss
0<h<20,0<s<200<h<20,0<s<20
How many schemes are there for downstairs?
Input
Two num: h,sh,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
",f(h,s));
return 0;
}
原题及思路和解答来自http://blog.renren.com/share/273685802/11043344928
十分感谢.
以上是关于matrix上的下楼梯问题的主要内容,如果未能解决你的问题,请参考以下文章