【bzoj3125】CITY 插头dp
题目描述
输入
输出
样例输入
4 4
....
..-.
....
....
样例输出
1
题解
插头dp
和 这道题 的唯一差别在于:部分格子只能上下通过或只能左右通过。
因此判断条件那里改一改就好了。
这里学了一下 CQzhangyu 的技♂巧:判断时只需要判断当前状态是否适用于当前格子,以及转移是否适用于当前格子即可。这样不合法的状态就会在下一步剪掉。这一步可以省很大的代码量。
注意开long long(题面的long指的就是int)
#include <cstdio>
#include <cstring>
typedef long long ll;
int m , a[13][13] , b[13] , w[1600000] , v[42000] , tot;
ll f[13][13][42000];
char str[14];
void dfs(int p , int c , int now)
{
if(c < 0 || c > m - p + 1) return;
if(p > m)
{
w[now] = ++tot , v[tot] = now;
return;
}
dfs(p + 1 , c , now);
dfs(p + 1 , c + 1 , now + b[p]);
dfs(p + 1 , c - 1 , now + 2 * b[p]);
}
inline int l(int v , int p)
{
int i , c = 0;
for(i = p ; ~i ; i -- )
{
if(v / b[i] % 3 == 1) c -- ;
if(v / b[i] % 3 == 2) c ++ ;
if(!c) return i;
}
return -1;
}
inline int r(int v , int p)
{
int i , c = 0;
for(i = p ; i <= m ; i ++ )
{
if(v / b[i] % 3 == 1) c ++ ;
if(v / b[i] % 3 == 2) c -- ;
if(!c) return i;
}
return -1;
}
int main()
{
int n , i , j , k , x , y , p , q;
ll ans = 0;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%s" , str + 1);
for(j = 1 ; j <= m ; j ++ )
{
if(str[j] == '.' || str[j] == '-') a[i][j] |= 1;
if(str[j] == '.' || str[j] == '|') a[i][j] |= 2;
if(str[j] != '#') x = i , y = j;
}
}
b[0] = 1;
for(i = 1 ; i <= m ; i ++ ) b[i] = b[i - 1] * 3;
dfs(0 , 0 , 0);
f[0][m][w[0]] = 1;
for(i = 1 ; i <= n ; i ++ )
{
for(j = 1 ; j <= tot ; j ++ )
if(v[j] % 3 == 0)
f[i][0][j] = f[i - 1][m][w[v[j] / 3]];
for(j = 1 ; j <= m ; j ++ )
{
for(k = 1 ; k <= tot ; k ++ )
{
p = v[k] / b[j - 1] % 3 , q = v[k] / b[j] % 3;
if((p && !(a[i][j] & 1)) || (q && !(a[i][j] & 2))) continue;
if(!a[i][j]) f[i][j][k] += f[i][j - 1][k];
else
{
if(!p && !q && a[i][j] == 3) f[i][j][w[v[k] + b[j - 1] + 2 * b[j]]] += f[i][j - 1][k];
if(!p && q && a[i][j] & 1) f[i][j][k] += f[i][j - 1][k];
if(p && !q && a[i][j] & 2) f[i][j][k] += f[i][j - 1][k];
if(!p && q) f[i][j][w[v[k] + q * (b[j - 1] - b[j])]] += f[i][j - 1][k];
if(p && !q) f[i][j][w[v[k] + p * (b[j] - b[j - 1])]] += f[i][j - 1][k];
if(p == 1 && q == 1) f[i][j][w[v[k] - b[j - 1] - b[j] - b[r(v[k] , j)]]] += f[i][j - 1][k];
if(p == 2 && q == 2) f[i][j][w[v[k] - 2 * (b[j - 1] + b[j]) + b[l(v[k] , j - 1)]]] += f[i][j - 1][k];
if(p == 2 && q == 1) f[i][j][w[v[k] - 2 * b[j - 1] - b[j]]] += f[i][j - 1][k];
if(p == 1 && q == 2 && i == x && j == y && v[k] == b[j - 1] + 2 * b[j]) ans += f[i][j - 1][k];
}
}
}
}
printf("%lld\n" , ans);
return 0;
}
【bzoj3125】CITY 插头dp的更多相关文章
- HDU 4064 Carcassonne(插头DP)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4064 Problem Description Carcassonne is a tile-based ...
- ural1519插头DP
1519. Formula 1 Time limit: 1.0 second Memory limit: 64 MB Background Regardless of the fact, that V ...
- 插头DP学习笔记——从入门到……????
我们今天来学习插头DP??? BZOJ 2595:[Wc2008]游览计划 Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该 ...
- RUAL1519 Formula 1 【插头DP】
RUAL1519 Formula 1 Background Regardless of the fact, that Vologda could not get rights to hold the ...
- URAL 1519 Formula 1(插头DP,入门题)
Description Background Regardless of the fact, that Vologda could not get rights to hold the Winter ...
- URAL1519 Formula 1 —— 插头DP
题目链接:https://vjudge.net/problem/URAL-1519 1519. Formula 1 Time limit: 1.0 secondMemory limit: 64 MB ...
- bzoj3125: CITY 题解
3125: CITY Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 486 Solved: 213[Submit][Status][Discuss] ...
- [专题总结]初探插头dp
彻彻底底写到自闭的一个专题. 就是大型分类讨论,压行+宏定义很有优势. 常用滚动数组+哈希表+位运算.当然还有轮廓线. Formula 1: 经过所有格子的哈密顿回路数. 每个非障碍点必须有且仅有2个 ...
- 「总结」插头$dp$
集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...
随机推荐
- 20155329胡佩伦 《Java程序设计》第3周学习总结
学号 2016-2017-20155329胡佩伦 <Java程序设计>第3周学习总结 教材学习内容总结 本周复习巩固了运算符. 前缀自增自减法(++i,--i): 先进行自增或者自减运算, ...
- 20155334 2016-2017-2 《Java程序设计》第十周学习总结
20155334 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 1.计算机网络概述 (1)路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以 ...
- 一个命令安装lnmp
安装LNMP执行:wget -c http://soft.vpser.net/lnmp/lnmp1.3-full.tar.gz && tar zxf lnmp1.3-full.tar. ...
- mysql-5.7.17-winx64免安装版环境配置 问题小记
安装版问题请自行百度或google 这里总结几个免安装版mysql-5.7.17-winx64配置后,出现问题的解决方法. 具体的环境配置请先参考mysql-5.7.17-winx64免安装版,win ...
- java class file
目录 什么是java类文件 幻数 主次版本号 常量池数和常量池 this_class super_class 接口数量和接口 字段数和字段 方法数和方法 以下内容主要还是参考<Inside JV ...
- [转]50 Tips for Working with Unity (Best Practices)
About these tips These tips are not all applicable to every project. They are based on my experience ...
- Update类型_JDBC的方法_JAVA方法_Loadrunner脚本
java vuser JDBC 参数化的方法 如果不进行参数化 直接把32 33行去掉 ,sql 值写到valuers 中就行了 下面这是 insert,delete,update 三种方法 ...
- 4星|《财经》2018年第13期:年轻人大多从大三和大四起开始就从QQ向微信转移
<财经>2018年第13期 总第530期 旬刊 本期主要话题是快递业,其他我感兴趣的重要话题还有:香港9价HPV疫苗断供风波:华盛顿邮报被贝佐斯收购后这几年的变化:北京二中朝阳学校的划片风 ...
- centos7.2部署docker-17.06.0-ce的bug:Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "process_linux.go:339: container init caused \"\"".
现象: 操作系统:centos 7.2 kernel 3.10.0-327.el7.x86_64 mesos:1.3.0 docker:docker-17.06.0-ce 在做mesos验证时,通过m ...
- 【python 3.6】如何将list存入txt后,再读出list
今天遇到一个需求,就是将一个list文件读取后,存入一个txt配置文件.存入时,发现list文件无法直接存入,必须转为str模式. 但在读取txt时,就无法恢复成list类型来读取了(准确地说,即使强 ...