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; } };
相关文章推荐
- topcoder srm 590 div1
- TC SRM 549 DIV2
- TC SRM 562 DIV 2
- TC SRM 570 div2 1000【Tree,树上统计】
- tc-SRM-626-DIV1-250
- TC SRM 683 Div.2 1000 subtreeCount
- [最小割] SRM 590 div1 FoxAndCity
- TC SRM 551 div2 题解
- TC SRM 553 DIV2
- TC(SRM)和CF入门教程for ACMer
- TC SRM 683 div2 MoveStonesEasy 贪心
- SRM590修建新道路(贪心法)
- TC SRM 557 DIV2 1000
- TC(SRM)和CF入门教程for ACMer[转载]
- TC SRM 585
- [TC] SRM 633 div2 250
- TC SRM 605
- tc-SRM-626-DIV1-250
- TC SRM 683 div2 EqualSubstrings2 纯暴力
- TC SRM 584 DIV 2