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
- TC SRM590 p1000
- TC SRM573 div2 p1000
- TC SRM601 div2 p1000
- TC
- tc
- 【Srm590】Fox And City(fox)
- 【Srm590】Fox And City(fox)
- Samsung P1000 解锁
- P1000的使用感受
- tyvi 评测 p1000 题
- codevs P1000 A+B
- P1000 A+B Problem
- P1000 A+B Problem
- 小白學JAVA-----P1000
- P1000 A+B Problem
- P1000 A + B(水题)
- P1000 超级玛丽游戏
- SRM590修建新道路(贪心法)
- 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习) .
- python 格式化输出
- Ubuntu下编译vlc源码
- 大话世界格局:春秋五霸与战国七雄
- 上班一周了
- TC SRM590 p1000
- 微信5.1更新,有新功能
- 和菜鸟一起学产品之交互式设计
- 天天飞车重磅推出
- GC之---MaxTenuringThreshold参数
- NoSQL数据库笔谈
- hdu 1025 Constructing Roads In JGShining's Kingdom
- Java 把一个InputStream转换为一个BufferedReader
- Beanstalk协议