Tsinsen A1110 街道

来源:互联网 发布:福州数据分析师 编辑:程序博客网 时间:2024/04/27 14:56

http://oj.tsinsen.com/A1110

分析:简单dp就行了。

一、初始化:dp[0][i] = dp[i][0] = 0, dp[1][1] = 1

二、递推公式dp[i][j] = (CanArrive_ij) ? dp[i - 1][j] + dp[i][j - 1] : 0

三、需要注意的就是数比较大,要用大整数,不过这个大整数不需要什么特性,数位都限制好了,很好写。

代码:

#include "bits/stdc++.h"using namespace std;class BigInt {public:    int num[20];    BigInt() { memset(num, 0, sizeof(num)); }    friend BigInt operator + (BigInt & v, BigInt & u) {        BigInt res; int t = 0;        for (int i = 0; i < 20; ++i) {            res.num[i] = v.num[i] + u.num[i] + t;            t = res.num[i] / 10; res.num[i] %= 10;        }        return res;    }};BigInt dp[55][55];int n, m, a, b, c, d;int main() {    scanf("%d%d%d%d%d%d", &n, &m, &a, &b, &c, &d);    dp[1][1].num[0] = 1;    for (int i = 1; i <= n; ++i)        for (int j = 1; j <= m; ++j) {            if (i >= a && i <= c && j >= b && j <= d) continue;            if (i != 1 || j != 1)                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];        }    int p = 19; while (dp[n][m].num[p] <= 0) --p;    for ( ; p >= 0; --p) printf("%d", dp[n][m].num[p]);    return 0;}
0 0