求格子的路径个数:

Starting in the top left corner of a 2×2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner.

How many such routes are there through a 20×20 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亿个路径,不得了……如果想象成图或者网络,果然是很大的开销)

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];
    }
View Code