您的位置:首页 > 其它

Project Euler - Problem 15

2012-05-05 08:22 381 查看
Starting in the top left corner of a 22 grid, there are 6 routes (without backtracking) to the bottom right corner.



How many routes are there through a 2020 grid?

解法一:

当前点到目标点的路径数=右边点到目标点的路径数 + 下边点到目标点的路径数

最右边或者最下边的一排,只能沿着目标方向垂直或者水平移动,因此路径为1。

static void HowManySteps()
{
long[,] matrix = new long[21,21];

for (int i = 0; i <= 20; i++)
{
matrix[20, i] = 1;
matrix[i, 20] = 1;
}

for (int i = 19; i >= 0; i--)
{
for (int j = 19; j >= 0; j--)
{
matrix[i, j] = matrix[i + 1, j] + matrix[i, j + 1];
}
}
Console.WriteLine(matrix[0, 0]);
}


解法二:

这是离散数学中的非降路径问题~~

可以将问题抽象为:从点(0, 0)运动到(m, n),只能朝右或者朝下运动,每次运动1步。相当于在m+n次的运动当中,选取m次来进行向右的运动,则剩下的n次就是向下的运动。

运用排列组合的数学只是,可以得出H(0, 0) = C(m+n, m) = C(m+n, n) = 40! / (20! * 20!)

static double JieChen(int n)
{
if (n == 1)
return 1;
else
return JieChen(n - 1) * n;
}

static void Main(string[] args)
{
double mPn = JieChen(40);
double m = JieChen(20);
double res = mPn / m / m;
Console.WriteLine(res);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: