51nod 1118 机器人走方格

因为这道题数据过大,所以如果直接用C(m,n)会发生错误,会发生溢出,而且因为除法的存在,求余运算都不能乱用了。


我开始错误的代码:

#include <iostream>

typedef long long ll;
const ll MODE = 1e + 7;

ll C(ll a, ll b)
{
    ll res = 1;
    for (ll i = 1; i <= b; ++i)
    {
        res = (res * (a - i + 1)  / i );
       // res /= i;
       std::cout << res << std::endl;
    }
   // std::cout << res << std::endl;
    std::cout << res << std::endl;
    return res % MODE;
}

int main()
{

    ll r, c;
    std::cin >> r >> c;
    std::cout << C(r + c - 2, r - 1) << std::endl;

    return 0;
}

然后可以用动态规划啊 。嘿嘿
#include <iostream>

typedef long long ll;
const int MAX = 1e3 + 5;
const int MODE = 1e9 +7;
ll dp[MAX];

int main()
{
    int n, m;
    std::cin >> n >> m;
    for (int i = 1; i <= m; ++i)
        dp[i] = 1;
    for (int i = 2; i <= n; ++i)
    {
        for (int j = 2; j <= m; ++j)
        {
            dp[j] = (dp[j] + dp[j - 1]) % MODE;
        }
    }

    std::cout << dp[m] << std::endl;

    return 0;
}
dp[i]表示走到第几列的方法。在for循环的过程中,dp[i]表示在第i列的当前行的方法数,dp[i]等于上一列的方法数,加上上一行的方法数,因为在循环的过程中,dp[i]表示的是当前行列交点位置的方法数,就等于dp[i](上一行i列的方法数)+dp[i-1](上一列第i行的方法数相加)。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值