斐波那契数列形式类似于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受限路径,只能是通过递归关系并且每次检查受限受限路径