怎么得到斐波那契数列?(m*n大小的矩形,从左上角走到左下角有多少种走法?包括一些引申题以及总结)

斐波那契数列形式类似于f(n)=f(n-1)+f(n-2),下面直接看题吧。


1m*n大小的矩形,从左上角走到左下角有多少种走法?

这是一道微软的面试题,只能向右走,或者向下走。

方法一

看到这道题目,不难,最直观的想法是深度搜索,但这个有点麻烦,如果我m和n比较大时,会有很深的递归深度,运算非常慢,而且还重复运算。如果看到重复运算呢,就可以想到用动态规划。

怎么得到那个递归式子呢?
假如说左上角坐标为(0,0),我现在在(i,j)处,怎么到达这点呢?只能从(i-1,j)和(i,j-1)处到达(i,j)
用m(i,j)记录到达(i,j)处的路径条数,则m(i,j)=m(i-1,j)+m(i,j-1),即为递归关系。
直接上代码吧

int pathNum(int m,int n)
{
	m=m+1;
	n=n+1;
	int **p=new int*[m];
	for(int i=0;i

方法二

从(0,0,)到(m,n),总共x方向走了m步,y方向走了n步。这么一看是不是觉得排列组合问题啊,那就很简单了,结果为C(m+n)n=(m+n)!/(m!*n!)



引申一:现在可以跳一步或者两步呢?怎么解呢?

其实与方法一还是比较类似的,考虑的情况比较多一点



引申二:如果有部分路径受限呢,

思路还是从方法一出发,不过要判断下,下面我们分析下:

如果当前在(i,j)处,那么(i-1,j)到(i,j)是否受限呢?(i,j-1)到(i,j)是否受限呢?

受限就舍去那一项,如果都受限,那没有方法到达那点。这就是解决受限路径的思路。


总结:1不受限的类似的题型有有爬台阶(点击打开链接),一个机器人走n米,它可以走1、2、3米,主要有两种方法:1)得到递归关系,2)排列组合

2受限路径,只能是通过递归关系并且每次检查受限受限路径

你可能感兴趣的:(算法题)