码就完事了。

#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的更多相关文章

  1. Codeforces Round #363 LRU(概率 状压DP)

    状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...

  2. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  3. Codeforces 429C Guess the Tree(状压DP+贪心)

    吐槽:这道题真心坑...做了一整天,我太蒻了... 题意 构造一棵 $ n $ 个节点的树,要求满足以下条件: 每个非叶子节点至少包含2个儿子: 以节点 $ i $ 为根的子树中必须包含 $ c_i ...

  4. Codeforces 895C Square Subsets(状压DP 或 异或线性基)

    题目链接  Square Subsets 这是白书原题啊 先考虑状压DP的做法 $2$到$70$总共$19$个质数,所以考虑状态压缩. 因为数据范围是$70$,那么我们统计出$2$到$70$的每个数的 ...

  5. 【题解】codeforces 8c Looking for Order 状压dp

    题目描述 Lena喜欢秩序井然的生活.一天,她要去上大学了.突然,她发现整个房间乱糟糟的--她的手提包里的物品都散落在了地上.她想把所有的物品都放回她的手提包.但是,这里有一点问题:她一次最多只能拿两 ...

  6. codeforces 342D Xenia and Dominoes(状压dp+容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...

  7. Codeforces 895C Square Subsets:状压dp【组合数结论】

    题目链接:http://codeforces.com/problemset/problem/895/C 题意: 给你n个数a[i].(n <= 10^5, 1 <= a[i] <= ...

  8. CodeForces 599E Sandy and Nuts 状压DP

    题意: 有一棵\(n(1 \leq n \leq 13)\)个节点的树,节点的标号为\(1 \sim n\),它的根节点是\(1\). 现在已知它的\(m(0 \leq m < n)\)条边,和 ...

  9. codeforces 580D Kefa and Dishes(状压dp)

    题意:给定n个菜,每个菜都有一个价值,给定k个规则,每个规则描述吃菜的顺序:i j w,按照先吃i接着吃j,可以多增加w的价值.问如果吃m个菜,最大价值是多大.其中n<=18 思路:一看n这么小 ...

随机推荐

  1. windows IDEA注册码激活方法(2018.4.8)靠谱可用!

    简介 intellij idea 2018注册码是针对intellij idea 2018软件研发推出,它的使用需要和激活补丁一起使用,安装包里面也拥有破解补丁, 所有无需在进行单独的下载:不过如果选 ...

  2. ubuntu安装jdk8

    文章连接:https://www.cnblogs.com/lighten/p/6105463.html 1.简单的安装方法 安装JDK的最简单方法应该就是使用apt-get来安装了,但是源一般是Ope ...

  3. bootstrap的treeview使用方法

    首先引入文件: <link href="./css/bootstrap.css" rel="stylesheet"> <script src= ...

  4. 连接mysql(建表和删表)

    from sqlalchemy.ext.declarative import declarative_base##拿到父类from sqlalchemy import Column##拿到字段from ...

  5. sysstat-----获取服务器负载历史记录

    sysstat工具与负载历史回放 很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来 ...

  6. 在多任务(RTOS)环境中使用看门狗

    最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章.从一个失败的太空项目出发,分析了看门狗的作用及使用,自我感觉很有启发,特此翻译此文并推荐给各位同仁.为了阅读方便,有些航天领域名词 ...

  7. java常见命名规则

    常见命名规则: 包:类似文件夹,用于把相同的类名进行区分(小写) 单级:例如:student 多级:例如:cn.student 类或者接口: 一个单词:单词首字母大写,例如:Student 多个单词: ...

  8. 电子书转换为PDF格式

    目录 一.mobi 转换 pdf 步骤 二.查看转换后的结果目录 三.将PDF还原文件名且移出至新目录 背景:当我们从网上下载一些电子小说或书籍的时候,一般文件的格式可能是.epub..mobi等.这 ...

  9. js获取url参数值,并解决中文乱码

    <script type="text/javascript"> function GetQueryString(name) { var reg = new RegExp ...

  10. LeetCode(101):对称二叉树

    Easy! 题目描述: 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2, ...