您的位置:首页 > 其它

51nod 1118 机器人走方格

2016-03-05 13:51 218 查看
因为这道题数据过大,所以如果直接用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行的方法数相加)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: