2331: [SCOI2011]地板
来源:互联网 发布:直播狗网络电视官网 编辑:程序博客网 时间:2024/03/28 21:11
插头dp;
姿态1;
#include<cstdio>#include<algorithm>#include<bitset>#define rep(i,k,n) for(int i=k;i<=(n);i++)#define mod 20110520using namespace std;const int N = 5000000;int n, m;int g[N], ans[N], state[700000], op = 0, top = 0;char s[105][105];int a[105][105];bool ok(int x) { rep(i, 0, m) { if((x >> (i * 2)) % 4 == 3)return false; } return true;}void init_state() { rep(i, 0, (1 << ((m+1) * 2)) - 1)if(ok(i))state[++top] = i; //}inline int F(int x, int pos, int up, int left) { int tmp = (x >> (pos * 2)) % 4; tmp ^= up; x ^= (tmp << (pos * 2)); x >>= 2; x <<= 2; x ^= left; return x;}int main() { // freopen("in.in", "r", stdin); scanf("%d%d", &n, &m); rep(i, 1, n)scanf("%s", s[i] + 1); if(n >= m) { rep(i, 1, n)rep(j, 1, m)a[i][j] = (s[i][j] == '_' ? 1 : 0); } else { rep(i, 1, n)rep(j, 1, m)a[j][i] = (s[i][j] == '_' ? 1 : 0); swap(n, m); } init_state(); ans[0]=1; rep(i, 1, n) { rep(j, 1, m) { rep(k, 1, top)g[state[k]] = 0; if(a[i][j]) { rep(k, 1, top) { int tmp = state[k]; if(!ans[state[k]])continue; int left = tmp % 4; int up = (tmp >> (j * 2)) % 4; if(!left && !up) { int ne = F(tmp, j, 2, 0); g[ne] = (g[ne] + ans[tmp]) % mod; ne = F(tmp, j, 0, 2); g[ne] = (g[ne] + ans[tmp]) % mod; ne = F(tmp, j, 1, 1); g[ne] = (g[ne] + ans[tmp]) % mod; //轮廓线!! } if(left == 1 && up == 0) { int ne = F(tmp, j, 0, 1); g[ne] = (g[ne] + ans[tmp]) % mod; ne = F(tmp, j, 0, 0); g[ne] = (g[ne] + ans[tmp]) % mod; } if(left == 0 && up == 1) { int ne = F(tmp, j, 1, 0); g[ne] = (g[ne] + ans[tmp]) % mod; ne = F(tmp, j, 0, 0); g[ne] = (g[ne] + ans[tmp]) % mod; } if(left== 2 && up == 0) { int ne = F(tmp, j, 0, 2); g[ne] = (g[ne] + ans[tmp]) % mod; ne = F(tmp, j, 1, 0); g[ne] = (g[ne] + ans[tmp]) % mod; } if(left == 0 && up == 2) { int ne = F(tmp, j, 2, 0); g[ne] = (g[ne] + ans[tmp]) % mod; ne = F(tmp, j, 0, 1); g[ne] = (g[ne] + ans[tmp]) % mod; } if(left == 2 && up == 2) { int ne = F(tmp, j, 0, 0); g[ne] = (g[ne] + ans[tmp]) % mod; } } rep(k, 1, top)ans[state[k]] = g[state[k]]; } else { rep(k, 1, top) {int tmp = state[k]; if((tmp % 4) || ((tmp >> (j * 2)) % 4))ans[tmp] = 0; } }}rep(k, 1, top) { int tmp = state[k]; if(tmp % 4)ans[tmp] = 0;}}printf("%d\n",ans[0]);return 0;}
0 0
- 【BZOJ 2331】 [SCOI2011]地板
- 2331: [SCOI2011]地板
- 2331: [SCOI2011]地板
- BZOJ 2331 [SCOI2011]地板
- BZOJ 2331 SCOI2011 地板 插头DP
- [BZOJ]2331: [SCOI2011]地板 插头DP
- [bzoj2331][SCOI2011]地板
- BZOJ2331 [SCOI2011]地板
- BZOJ2331: [SCOI2011]地板
- 【SCOI2011】bzoj2331 地板
- bzoj2331: [SCOI2011]地板
- ☆【动态规划】【SCOI2011】地板
- 【bzoj2331】[SCOI2011]地板 插头dp
- Bzoj2331[SCOI2011]地板:插头dp
- [插头DP] BZOJ2331 && SCOI2011 地板
- BZOJ 2331 SCOI 2011 地板 插头DP
- 硬木地板
- [scoi2011]糖果
- python_正则表达式(一)基础标识符
- HDU-4035 Maze (概率DP&&树形DP)
- latex---中文模板
- Maven学习总结(18)——深入理解Maven仓库
- tomcat7并发和线程数
- 2331: [SCOI2011]地板
- Less10分钟入门
- Errors while building APK. You can find the errors in the 'Messages' view.
- 排序问题-快速排序
- Django项目部署 - 多服务器分离
- LeetCode|Convert * to Binary Search Tree
- Single Sign On
- Java千百问_06数据结构(002)_java有哪8种基本数据类型
- Tomcat7并发优化