您的位置:首页 > 其它

TC SRM590 p1000

2013-12-18 18:50 211 查看

题目大意

给一个棋盘,由"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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: