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

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


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

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

方法一

看到这道题目,不难,最直观的想法是深度搜索,但这个有点麻烦,如果我m和n比较大时,会有很深的递归深度,运算非常慢,而且还重复运算。如果看到重复运算呢,就可以想到用动态规划。<p>怎么得到那个递归式子呢?
假如说左上角坐标为(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<m;i++)
	{
		p[i]=new int[n];
	}

	for(int i=0;i<n;i++)
		p[0][i]=1;
	for(int i=0;i<m;i++)
	{
		p[i][0]=1;
	}
	for(int i=1;i<m;i++)
		for(int j=1;j<n;j++)
		{
			p[i][j]=p[i-1][j]+p[i][j-1];
		}
	return p[m-1][n-1];
}

方法二

从(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受限路径,只能是通过递归关系并且每次检查受限受限路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值