【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$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...
随机推荐
- 优步司机如何联系客服?uber客服渠道,Uber优步司机客服渠道
预约客服导航 为了更好的快速.有效地解决您的疑问,Uber优步从今日起开通了在线客服平台.如果您通过司机服务/常见问题没有找到您需要的答案,您可以通过点击下方的“进入在线客服平台”与我们的工作人员在线 ...
- 【转载】CPU阿甘
原文:CPU阿甘 前言 上帝为你关闭了一扇门,就一定会为你打开一扇窗这句话来形容我最合适不过了.我是CPU, 他们都叫我阿甘, 因为我和<阿甘正传>里的阿甘一样, 有点傻里傻气的.上帝 ...
- 【Loj10222】佳佳的Fibonacci
题面 题解 可以发现\(T(n)\)无法用递推式表示. 于是我们做如下变形: \[ T(n) = \sum _ {i = 1} ^ n i \times f_i \\ S(n) = \sum _ {i ...
- [转]WIN2008 IIS7的日期格式
最近项目升级服务器从32位升级到64位的WIN2008,日期显示格式非我们所期望的yyyy-M-d格式,原以为修改控制面板的日期格式即可,可是不行. 修改注册表问题解决. 修改方法: 运行注册表编辑器 ...
- 六、EnterpriseFrameWork框架基础功能之权限管理
回<[开源]EnterpriseFrameWork框架系列文章索引> 从本章开始进入框架的第二块内容“EnterpriseFrameWork框架的基础功能”,包括:权限管理.字典数据管理. ...
- python基础数据类型3
python_day_5 今日大纲: 1. dict 用大括号{} 括起来. 内部使用key:value的形式来保存数据 {'jay':'周杰伦', "jj":'林俊杰'} 注意: ...
- Oracle的集合运算符
Oracle的集合运算符有并集union.union all,交集intersect,差集minus 先建表myemp,进行集合运算的测试 create table myemp as select * ...
- Linux 安装Zookeeper<集群版>(使用Mac远程访问)
阅读本文需要先阅读安装Zookeeper<准备> 一 架构细节 zookeeper集群根据投票选举的机制 选出leader和follower zookeeper集群节点建议是奇数 这里我准 ...
- 003 -- Dubbo简单介绍
1:Dubbo的基本概念 dubbo是阿里巴巴SOA服务治理 方案的核心框架,每天为20000+个服务次的数据量访问支持.dubbo是一个分布式的服务框架,致力于提供高性能和透明化的RPC远程服务调用 ...
- CSP201312-3:最大的矩形
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...