Project Euler - Problem 15

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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值