TC SRM590 p1000

来源:互联网 发布:网络测线仪 编辑:程序博客网 时间:2024/05/17 07:46

题目大意

给一个棋盘,由"U”,“D”,"."组成,其中U代表每次只能向上移动若干格子的棋子,D代表每次只能向下移动若干格子的棋子,.代表空点,问最多能移动出来多少种方案。

解题思路

既然题目中说了棋子只能上下移动,那么列与列之间没有任何的关系,都是独立的,换句话说,我们只需要单独考虑每一列之间的关系然后用乘法原理算出来就行了。
每一列之中有多少个方案还是比较好算的,对于U棋子,每一个它下面的棋子都能够成为它的上面的状态,而对于D棋子,它上面的空格将会成为它的上一个状态。直接DP就可以解决,然后列与列之间再乘一下就是最终的结果。

代码

const int mod = (int)1e9 +7;typedef long long ll;ll solve(string s){    vector<pair<int, int> >v;    ll dp[64][64];    memset(dp, 0, sizeof(dp));    int n = s.size();    for (int i = 0; i < n; i++){        if (s[i] == 'U') v.push_back(make_pair(i, -1));        else if (s[i] == 'D') v.push_back(make_pair(i, 1));    }    int m = v.size();    if (m == 0) return 1ll;    for (int i = v[0].first; i >= 0 && i < n; i += v[0].second)        dp[0][i] = 1;    for (int i = 1; i < m; i++)        for (int j = v[i].first; j >= 0 && j < n; j += v[i].second)            for (int k = 0; k < j; k++)                dp[i][j] = (dp[i][j] + dp[i - 1][k]) % mod;    ll ret = 0LL;    for (int i = 0; i < n; i++)        ret = (ret + dp[m - 1][i]) % mod;    return ret;}class FoxAndShogi {public:int differentOutcomes(vector <string> b) {int n = b.size();ll ans = 1;for (int i = 0; i < n; i++){            string cur = "";            for (int j = 0; j < n; j++) cur += b[j][i];            int tmp = solve(cur);            ans = (ans * tmp) % mod;}return ans;}};


0 0
原创粉丝点击