51nod 1118 机器人走方格

来源:互联网 发布:app java后端开发 编辑:程序博客网 时间:2024/04/30 15:39

因为这道题数据过大,所以如果直接用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
原创粉丝点击