求格子的路径个数:
Starting in the top left corner of a 22 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner.
![](http://projecteuler.net/project/images/p_015.gif)
How many such routes are there through a 2020 grid?
思想:这是做了这么久之后我比较喜欢的一个题,终于要思考推一下下了。
给格子上的顶点依次从(0,0)标起,往右或者往下两个数字依次加1,将题目的示例就可以转化为(0,0)->(2,2)的路径,定义为f(2,2),初试设f(0,0)=1。现在要求20*20格的,即求f(20,20)
如果不考虑边界点,比如示例中的(1,1)点,只有两条路径可以抵达它,即他的路径是由经过(1,0)和(0,1)亮点路径抵达的。同理的推断有f(n,m)=f(n,m-1)+f(n-1,m)
如果是边界点,那么只有一个边可以经过,为了得到一个更规范的示例,f(0,n)=f(0,n-1),f(m,0)=f(m-1,0)
由此可见,其实就是一个变形的斐波那契数列,因此可以解题。
最好不采用递归做……
代码:(最后的答案竟然是个long值,吓死我了,就这么一点点,就超过2亿个路径,不得了……如果想象成图或者网络,果然是很大的开销)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
private static long latticePaths(int n) { int k = 0; long[][] a = new long[n + 1][n + 1]; a[0][0] = 1L; while (++k <= n) { for (int i = 0; i < k; i++) { if (i > 0) { a[i][k] += a[i - 1][k]; a[k][i] += a[k][i - 1]; } if (k > 0) { a[i][k] += a[i][k - 1]; a[k][i] += a[k - 1][i]; } } if (k > 0) a[k][k] = a[k - 1][k] + a[k][k - 1]; } return a[n][n]; }