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这么小 ...
随机推荐
- windows IDEA注册码激活方法(2018.4.8)靠谱可用!
简介 intellij idea 2018注册码是针对intellij idea 2018软件研发推出,它的使用需要和激活补丁一起使用,安装包里面也拥有破解补丁, 所有无需在进行单独的下载:不过如果选 ...
- ubuntu安装jdk8
文章连接:https://www.cnblogs.com/lighten/p/6105463.html 1.简单的安装方法 安装JDK的最简单方法应该就是使用apt-get来安装了,但是源一般是Ope ...
- bootstrap的treeview使用方法
首先引入文件: <link href="./css/bootstrap.css" rel="stylesheet"> <script src= ...
- 连接mysql(建表和删表)
from sqlalchemy.ext.declarative import declarative_base##拿到父类from sqlalchemy import Column##拿到字段from ...
- sysstat-----获取服务器负载历史记录
sysstat工具与负载历史回放 很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来 ...
- 在多任务(RTOS)环境中使用看门狗
最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章.从一个失败的太空项目出发,分析了看门狗的作用及使用,自我感觉很有启发,特此翻译此文并推荐给各位同仁.为了阅读方便,有些航天领域名词 ...
- java常见命名规则
常见命名规则: 包:类似文件夹,用于把相同的类名进行区分(小写) 单级:例如:student 多级:例如:cn.student 类或者接口: 一个单词:单词首字母大写,例如:Student 多个单词: ...
- 电子书转换为PDF格式
目录 一.mobi 转换 pdf 步骤 二.查看转换后的结果目录 三.将PDF还原文件名且移出至新目录 背景:当我们从网上下载一些电子小说或书籍的时候,一般文件的格式可能是.epub..mobi等.这 ...
- js获取url参数值,并解决中文乱码
<script type="text/javascript"> function GetQueryString(name) { var reg = new RegExp ...
- LeetCode(101):对称二叉树
Easy! 题目描述: 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2, ...