HDU 1693 插头dp入门详解
放题目链接 https://vjudge.net/problem/22021/origin
给出一个n*m的01矩阵,1可走0不可通过,要求走过的路可以形成一个环且可以有多个环出现,问有多少不同的行走方案;
这道题目可以有多个环而不是限制为一个环,大大减弱了题目的难度,我还是想了好久。
先简单介绍一下轮廓线及插头,
这种dp进行状态转移时,每个方格对应着他自己的一条轮廓线,由上一个方格的轮廓线的状态,推导当前方格的轮廓线状态。
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
table.MsoTableGrid
{mso-style-name:网格型;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-priority:39;
mso-style-unhide:no;
border:solid windowtext 1.0pt;
mso-border-alt:solid windowtext .5pt;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-border-insideh:.5pt solid windowtext;
mso-border-insidev:.5pt solid windowtext;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
K1 |
K0 |
||
K2 (3,3) |
|||
K4 |
K3 |
||
做的图不兼容只能这样看了,对于正在推倒的方格(3,3),蓝色那条轮廓线就是前一个方格(3,2)的轮廓线,根据这条蓝线的状态推导(3,3)的轮廓线状态,
由于每个格子都要通过,所以只要标记为'1'的格子对应的轮廓线上肯定要有插头,不然就不合法了,也就是说每个线只有两个情况0/1,
我们用一个整数的二进制表示这条线,假设x的二进制为k0k1k2k3k4,对应图中的蓝线旁的字符,进行状态压缩。
横线如果有插头,就是上下方向的,竖线就是左右方向的,能决定当前格子的就是k1和k2位了,其他位置不影响穿过当前格子的插头。
假设此格子是非障碍格,
当k1=k2=1时,表示有一个拐角状的插头穿过了这个格,显然这个格子不能再有插头了,将蓝线状态中的k1-->0,k2-->0,就是更新后的状态,让他加上蓝线状态的方案数
当k1=k2=0时,表示没有插头穿过格子,所以我们要给他加上一个拐角作为初始格,将k1->1,k2->1即可。
当k1=0,k2=1时,这个插头可以向右走或向下走,判断一下这两种情况是否合法,是的话进行转移。
当k1=1,k2=0时,同上。
如果这是个障碍格,只有k1=k2=0时才能转移,因为障碍格一定没插头。
还有一点要说的是由上一行最后一个状态向下一行第一个状态转移时,
由于上一行最后一个状态中k0位一定是0(边界定无右插头),下一行第一个的k4也一定是0
所以直接右移一位即可。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int N,M,e[][];
LL dp[][<<];
LL solve()
{
memset(dp,,sizeof(dp));
int cur=,i,j,k;
dp[][]=;
for(i=;i<=N;++i)
{
cur^=;
memset(dp[cur],,sizeof(dp[cur]));
for(k=;k<(<<M);++k)
dp[cur][k<<]=dp[cur^][k];
for(j=;j<=M;++j)
{
cur^=;
memset(dp[cur],,sizeof(dp[cur]));
for(k=;k<(<<(M+));++k)
{
if(!dp[cur^][k]) continue;
int y=k&(<<(j-)),y1=<<(j-);
int x=k&(<<j),x1=<<j;
if(e[i][j]){
if(x&&y) dp[cur][k^x1^y1]+=dp[cur^][k];
if(!(x+y)) dp[cur][k|x1|y1]+=dp[cur^][k];
if(x&&(!y)){
if(j<M&&e[i][j+]) dp[cur][k]+=dp[cur^][k];
if(i<N&&e[i+][j]) dp[cur][k^x1|y1]+=dp[cur^][k];
}
if(!x&&y){
if(j<M&&e[i][j+]) dp[cur][k^y1|x1]+=dp[cur^][k];
if(i<N&&e[i+][j]) dp[cur][k]+=dp[cur^][k];
}
}
else{
if(!(x+y)) dp[cur][k]+=dp[cur^][k];
}
}
}
} return dp[cur][];
}
int main()
{
int t,i,j;
scanf("%d",&t);
for(int cas=;cas<=t;++cas){
memset(e,,sizeof(e));
scanf("%d%d",&N,&M);
for(i=;i<=N;++i)
for(j=;j<=M;++j) scanf("%d",&e[i][j]);
printf("Case %d: There are %lld ways to eat the trees.\n",cas,solve());
}
return ;
}
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
K1 |
K0 |
||
K2 (3,3) |
|||
K4 |
K3 |
||
![]() |
|||||||||
![]() |
|||||||||
![]() |
|||||||||
![]() |
|||||||||
![]() |
|||||||||
Normal
0
false
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
table.MsoTableGrid
{mso-style-name:网格型;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-priority:39;
mso-style-unhide:no;
border:solid windowtext 1.0pt;
mso-border-alt:solid windowtext .5pt;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-border-insideh:.5pt solid windowtext;
mso-border-insidev:.5pt solid windowtext;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
HDU 1693 插头dp入门详解的更多相关文章
- hdu 1693 插头dp入门
hdu1693 Eat the Trees 题意 在\(n*m\)的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少种方法. 解法 这是一道插头dp的入门题,只需要 ...
- 状压DP入门详解+题目推荐
在动态规划的题型中,一般叫什么DP就是怎么DP,状压DP也不例外 所谓状态压缩,一般是通过用01串表示状态,充分利用二进制数的特性,简化计算难度.举个例子,在棋盘上摆放棋子的题目中,我们可以用1表示当 ...
- 树形DP入门详解+题目推荐
树形DP.这是个什么东西?为什么叫这个名字?跟其他DP有什么区别? 相信很多初学者在刚刚接触一种新思想的时候都会有这种问题. 没错,树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上. 既 ...
- 数位DP入门详解+题目推荐
\(update:2019-9-6\) 博客里某些东西没有解释清楚,完善了对应的解释 在开始之前,我们先来看一道题--题目链接 题目要求,相邻两位的差大于等于2,那么我们先来构造一个试一试. 比如说\ ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- SQL注入攻防入门详解(2)
SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...
- Quartz 入门详解
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...
- Redis快速入门详解
Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis ...
随机推荐
- 获取IE (控件)的所有链接(包括Frameset, iframe)
获取IE (控件)的所有链接(包括Frameset, iframe) IE 顶层 body 节点通过IHTMLElement->get_all 方法无法获取iframe 里面的节点列表 CCom ...
- jQuery动态效果学习笔记
资料来源 W3Cschool 1.元素的显示与隐藏 1.1显示元素show() 语法 $(selector).show(speed,callback); 显示已经设置隐藏的元素 1.2隐藏元素hide ...
- 树莓派搭建Git服务器
目录 安装ssh 安装git-core 新增git用户 设置git用户目录 [服务端]设置git仓库 [客户端]设置git仓库 设置ssh登录 安装ssh sudo apt-get install s ...
- Maven打包部署
Maven打Jar包 问题一 Eclipse突然SB告诉我类不存在还让我导包进来O__O "…,但是我明明有这个类.这是不要慌,通过在网上搜索得知:由于eclipse的编译是基于时间戳的判断 ...
- 斐迅面试记录—SSL和TLS的区别
SSL 是洋文“Secure Sockets Layer”的缩写,中文叫做“安全套接层”.它是在上世纪90年代中期,由网景公司设计的.(顺便插一句,网景公司不光发明了 SSL,还发明了很多 Web 的 ...
- Oracle DDL+DML+DCL实例
SQL语言共分为四大类: 数据查询语言DQL: 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块. 数据操纵语言DML: DML是“数据操纵语言”( Data ...
- es6函数模块-------初步学习
初步学习: 函数参数允许尾逗号 function clownsEverywhere( param1, param2, //param2后面有逗号 ) { } 函数参数可以赋初值 利用解构赋值默认值结合 ...
- 2018秦皇岛ccpc-camp Steins;Gate (原根+FFT)
因为给定的模数P保证是素数,所以P一定有原根. 根据原根的性质,若\(g\)是\(P\)的原根,则\(g^k\)能够生成\([1,P-1]\)中所有的数,这样的k一共有P-2个. 则\(a_i*a_j ...
- oracle 11g怎样配置才能连接远程数据库
打开所有程序->找到oracle-oradb11g-home1->Net Configuration Assistant,如图所示 选择本地网络服务名配置,点击下一步 选择添 ...
- Android系统机制
Android系统机制 本文主要介绍Android系统整体运行机制 Linux中的一些概念 uboot加载系统内核到内存,系统内核运行起来的后,会创建第一个用户进程叫init进程,该进程是所有用户进程 ...