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 ...
随机推荐
- shared_ptr的线程安全
1.9 再论shared_ptr 的线程安全 虽然我们借shared_ptr 来实现线程安全的对象释放,但是shared_ptr 本身不是100% 线程安全的.它的引用计数本身是安全且无锁的,但对象的 ...
- js 有小数点数据求和多出小数点问题记录
>> +192.92 << 492.91999999999996 >> (*+)/ << 492.92 做统计汇总时,页面加和,展示出一堆的小数点. 网 ...
- 189. Rotate Array(两次反转)
DescriptionHintsSubmissionsDiscussSolution Pick One Rotate an array of n elements to the right by ...
- 新一批创业者金矿,iclap谁与争锋
19世纪,美国西部开发,无数拓荒者涌入,并最终因金矿的发现形成了淘金热.而当无数人埋头寻找黄金之时,有一个人却抬起头看到了潜藏在无数淘金者身上的金矿-这个人就是牛仔裤的发明者,Levi’s的创始人-李 ...
- Java 对比Hashtable、Hashmap、Treemap有什么不同?
①基本理解 Hashtable.Hashmap.Treemap都是最常见的一些Map实现,是以键值对的形式存储和操作数据的容器类型. Hashtable是Java类库提供的一个哈希实现,本身是同步的, ...
- pigeon 介绍
https://github.com/dianping/pigeon Pigeon开发指南 Pigeon是一个分布式服务通信框架(RPC),在美团点评内部广泛使用,是美团点评最基础的底层框架之一. 主 ...
- JVM基本配置与调优
JVM基本配置与调优 JVM调优,一般都是针对堆内存配置调优. 如图:堆内存分新生代和老年代,新生代又划分为eden区.from区.to区. 一.区域释义 JVM内存模型,堆内存代划分为新生代和老年代 ...
- cmd中测试常用到的命令汇总
1.最常用的 ping +ip 2.测试到远程服务器之间是否通的命令 telnet +ip +端口 3.路由跟踪,通过跟踪可以找到到哪地方不通 tracert ip linux系统 tra ...
- [转]总结一下CSS中的定位 Position 属性
在CSS中,Position 属性经常会用到,主要是绝对定位和相对定位,简单的使用都没有问题,尤其嵌套起来,就会有些混乱,今记录总结一下,防止久而忘之. CSS position 属性值: absol ...
- java压缩多个文件
首先创建一个工具类,定义好接口,这里的参数1:fileList:多个文件的path+name2: zipFileName:压缩后的文件名 下面是代码,注释已经很详细了 public class ZIP ...




