Codeforces 342D Xenia and Dominoes 状压dp
码就完事了。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 1e4 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); template<class T>
void add(T &a, T b) {
a += b; if(a >= mod) a -= mod;
} int n, tx, ty;
int dp[N][ << ][];
int state[N];
char Map[][N]; bool can(int x, int y, int op) {
if(op == ) return Map[x][y] == '.' && Map[x][y + ] == '.';
else return Map[x][y] == '.' && Map[x + ][y] == '.';
} bool ok(int x, int y, int op) {
if(op == ) {
if(x != tx) return false;
return y + == ty || y - == ty;
} else {
if(y != ty) return false;
return x + == tx || x - == tx;
}
} int main() {
scanf("%d", &n);
for(int i = ; i < ; i++) scanf("%s", Map[i] + );
for(int i = ; i < ; i++) {
for(int j = ; j <= n; j++) {
if(Map[i][j] == 'O') {
tx = i;
ty = j;
i = ;
break;
}
}
}
for(int j = ; j <= n; j++) {
for(int i = ; i < ; i++)
if(Map[i][j] != '.') state[j] |= << i;
}
dp[][state[]][] = ;
for(int j = ; j <= n; j++) {
for(int mask = ; mask < ( << ); mask++) {
for(int k = ; k < ; k++) {
if(mask == ) {
if(can(, j, ) && can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, ) || ok(, j, )], dp[j][mask][k]);
if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]);
if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]); } else if(mask == ) {
if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]);
if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) {
if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]);
if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { add(dp[j + ][ | state[j + ]][k], dp[j][mask][k]); }
}
}
}
printf("%d\n", dp[n + ][][]);
return ;
} /*
*/
Codeforces 342D Xenia and Dominoes 状压dp的更多相关文章
- Codeforces Round #363 LRU(概率 状压DP)
状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- Codeforces 429C Guess the Tree(状压DP+贪心)
吐槽:这道题真心坑...做了一整天,我太蒻了... 题意 构造一棵 $ n $ 个节点的树,要求满足以下条件: 每个非叶子节点至少包含2个儿子: 以节点 $ i $ 为根的子树中必须包含 $ c_i ...
- Codeforces 895C Square Subsets(状压DP 或 异或线性基)
题目链接 Square Subsets 这是白书原题啊 先考虑状压DP的做法 $2$到$70$总共$19$个质数,所以考虑状态压缩. 因为数据范围是$70$,那么我们统计出$2$到$70$的每个数的 ...
- 【题解】codeforces 8c Looking for Order 状压dp
题目描述 Lena喜欢秩序井然的生活.一天,她要去上大学了.突然,她发现整个房间乱糟糟的--她的手提包里的物品都散落在了地上.她想把所有的物品都放回她的手提包.但是,这里有一点问题:她一次最多只能拿两 ...
- codeforces 342D Xenia and Dominoes(状压dp+容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...
- Codeforces 895C Square Subsets:状压dp【组合数结论】
题目链接:http://codeforces.com/problemset/problem/895/C 题意: 给你n个数a[i].(n <= 10^5, 1 <= a[i] <= ...
- CodeForces 599E Sandy and Nuts 状压DP
题意: 有一棵\(n(1 \leq n \leq 13)\)个节点的树,节点的标号为\(1 \sim n\),它的根节点是\(1\). 现在已知它的\(m(0 \leq m < n)\)条边,和 ...
- codeforces 580D Kefa and Dishes(状压dp)
题意:给定n个菜,每个菜都有一个价值,给定k个规则,每个规则描述吃菜的顺序:i j w,按照先吃i接着吃j,可以多增加w的价值.问如果吃m个菜,最大价值是多大.其中n<=18 思路:一看n这么小 ...
随机推荐
- python习题实例(上)_update18/07/03
用以记录python学习过程中做过的小习题~ ヾ(◍°∇°◍)ノ゙ 1.生成两个列表,分别存放将100以内的偶数&奇数 odd_number=[] even_number=[] for i i ...
- 【原创】编程基础之Ruby
ruby2.6.2 官方:https://www.ruby-lang.org/en/ 一 简介 A dynamic, open source programming language with a f ...
- .NET NPOI操作Excel 让单元格的内容换行
HSSFWorkbook workbook = new HSSFWorkbook(); // 工作簿 ISheet sheet = workbook.CreateSheet("会员列表&qu ...
- wet 下载jdk 64位
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com% ...
- iOS ReplayKit 录屏 框架的使用
在需要使用录屏的 地方 引入 头文件 #import <ReplayKit/ReplayKit.h> 添加代理 RPPreviewViewControllerDelegate 因为 iOS ...
- STM32L476应用开发之七:流量的PID控制
在气体分析仪使用过程中,为了力求分析结果的准确性,一般要求通过的气体流量尽可能的稳定.为了保证流量控制的稳定,我们采用PID调节来控制气路阀门的开度. 1.硬件设计 我们采用的流量计为气体质量流量计, ...
- url加密和解密
.NET中加密和解密有两种方式 string file="文件上(传)篇.doc";string Server_UrlEncode=Server.UrlEncode(file);s ...
- Oracle 口令文件:即 oracle密码文件
一:文件路径位置 [oracle@localhost db_1]$ cd $ORACLE_HOME/dbs [oracle@localhost dbs]$ ls dbsorapwPROD1 hc_or ...
- day14 迭代器 生成器 面向过程思想
"" 迭代器 什么是迭代器(iterator) 器指的某种工具, 迭代指的是更新换代的过程,例如应用程序的版本更新从1.0 变成 1.1 再1.2 迭代的目的是要根据上一个结果,产 ...
- kali linux revealed mastering the penetration testing distribution
1.本博客记载的是这本书的学习笔记,还有出现的一些不懂的单词 我也将会记载这篇博客中.记载顺序是按照本书的章节顺序来记载的.最喜欢本书中的一句 you havae no idea how good ...