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 ...
随机推荐
- Ubuntu解压命令全览
1. Ubuntu解压命令全览.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName 注:tar是打包,不是压缩! .gz 解压1:g ...
- php等守护进程监控脚本(转载 http://www.9958.pw/post/php_script_scan)
此脚本用户守护监控进程的执行情况,因为有的时候,我们用各类开发语言做的守护进程可能会因为一些特殊情况被退出,所以此脚本就是为了重启这些进程 代码: #!/bin/bash EMAIL='9958_pw ...
- 在Idea中连接数据库并生成实体类(mybatis逆向生成实体类)
1.连接数据库 (1)按下图 , 点击view-----选择tool windows----------选择database并点击 (2)弹出Database窗口 点击加号------------选 ...
- git 常用的撤销操作
git 开发时的使用流程,从同事那里学习的, 第一步,先建立一个新的分支,可以在GITLAB或通过命令git checkout -b newbranch 或通过IDE插件 第二步,让项目切换到该分支, ...
- JFreeChart的简单应用及乱码解决
一.JFreeChart介绍: JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP ...
- nginx windows版本 1024限制
Windows版本因为文件访问句柄数被限制为1024了,当访问量大时就会无法响应. 会有如下错误提示:maximum number of descriptors supported by select ...
- hadoop https配置
在 hadoop1生成ca并拷贝至hadoop2,hadoop2. (密码随便设置,大于6位即可.如adminadmin) cd /etc/https openssl req -new -x509 - ...
- 20145302张薇《Java程序设计》第八周学习总结
20145302 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 日志API简介 使用日志的起点是Logger类,要取得Logger类,必须使用Logger的静态方法get ...
- 20145335郝昊《java程序设计》第2次实验报告
20145335郝昊<java程序设计>第2次实验报告 实验名称 Java面向程序设计,采用TDD的方式设计有关实现复数类Complex. 理解并掌握面向对象三要素:封装.继承.多态. 运 ...
- 输入n,求1~n累加
最开始可能会使用for循环来计算,现在直接使用等差数据计算和公式:s=(a0+n)*n/2 long sum(int n) { long ret=0: ret = (1+n)* n /2: retur ...




