题目

给出 \(n*m\) 的方格,有些格子不能铺线,

其它格子必须铺,可以形成多个闭合回路。

问有多少种铺法? \(n,m\leq 12\)


分析

设 \(dp[n][m][S][0/1]\) 表示处理到 \((n,m)\),

目前插头的状态为 \(S\),并且左插头是否向右暴露,

插头的状态指的是轮廓线上的上插头是否向下暴露,这个分类讨论一下就可以了,

注意到右边界的位置左插头不能向右暴露,并且不能铺线的地方要继续更新方案


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
int n,m,al,a[12][12];
long long dp[4101][2],f[4101][2];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
signed main(){
for (rr int T=iut();T;--T){
memset(dp,0,sizeof(dp));
n=iut(),m=iut(),al=1<<m,dp[0][0]=1;
for (rr int i=0;i<n;++i)
for (rr int j=0;j<m;++j)
a[i][j]=iut();
for (rr int i=0;i<n;++i)
for (rr int j=0;j<m;++j){
if (a[i][j]){
for (rr int k=0;k<al;++k)
if ((k>>j)&1){
f[k][0]+=dp[k][0];//|
f[k^(1<<j)][1]+=dp[k][0];//L
f[k^(1<<j)][0]+=dp[k][1];//>
}else{
f[k][1]+=dp[k][1];//-
f[k|(1<<j)][0]+=dp[k][1];//7
f[k|(1<<j)][1]+=dp[k][0];//<
}
}else{
for (rr int k=0;k<al;++k)
if (!((k>>j)&1))
f[k][0]=dp[k][0];//不存在插头
}
if (j==m-1){
for (rr int k=0;k<al;++k)
f[k][1]=0;//不能有暴露的左插头
}
memcpy(dp,f,sizeof(dp));
memset(f,0,sizeof(f));
}
printf("%lld\n",dp[0][0]);
}
return 0;
}

简化

可以发现,dp数组能够被压成一维,记录 \(m+1\) 个插头,

轮廓线往右移动一格左插头也向右移动一个。

注意位于行末时需要移除右侧插头并补上左侧插头,即调整轮廓线的状态


代码(HDU 1693)

#include <cstdio>
#include <cctype>
using namespace std;
int T,two[14],n,m,al;
long long f[8192],dp[8192];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int main(){
T=iut(),two[0]=1;
for (int i=1;i<=13;++i) two[i]=two[i-1]<<1;
for (int _T=1;_T<=T;++_T){
n=iut(),m=iut(),al=two[m+1]-1;
for (int i=0;i<=al;++i) f[i]=0; f[0]=1;
for (int i=0;i<=al;++i) dp[i]=f[i];
for (int i=0;i<n;++i)
for (int j=0;j<m;++j){
int x=iut();
for (int S=0;S<=al;++S) f[S]=0;
for (int S=0;S<=al;++S)
if (dp[S]){
bool zuo=(S>>j)&1,upp=(S>>(j+1))&1;
if (x){
f[S^two[j]^two[j+1]]+=dp[S];//转弯
if (zuo!=upp) f[S]+=dp[S];//直行
}else if (!zuo&&!upp) f[S]+=dp[S];
}
for (int S=0;S<=al;++S)
if (j<m-1) dp[S]=f[S];
else dp[S]=(S&1)?0:f[S>>1];//行末最右侧的左插头不存在,插头整体往右移动一格,同时在左侧补上左插头
}
printf("Case %d: There are %lld ways to eat the trees.\n",_T,dp[0]);
}
return 0;
}

#插头dp#洛谷 5074 HDU 1693 Eat the Trees的更多相关文章

  1. hdu 1693 Eat the Trees——插头DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1693 第一道插头 DP ! 直接用二进制数表示状态即可. #include<cstdio> # ...

  2. HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)

    插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...

  3. HDU 1693 Eat the Trees(插头DP)

    题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘 ...

  4. HDU - 1693 Eat the Trees(多回路插头DP)

    题目大意:要求你将全部非障碍格子都走一遍,形成回路(能够多回路),问有多少种方法 解题思路: 參考基于连通性状态压缩的动态规划问题 - 陈丹琦 下面为代码 #include<cstdio> ...

  5. HDU 1693 Eat the Trees(插头DP,入门题)

    Problem Description Most of us know that in the game called DotA(Defense of the Ancient), Pudge is a ...

  6. HDU 1693 Eat the Trees (插头DP)

    题意:给一个n*m的矩阵,为1时代表空格子,为0时代表障碍格子,问如果不经过障碍格子,可以画一至多个圆的话,有多少种方案?(n<12,m<12) 思路: 这题不需要用到最小表示法以及括号表 ...

  7. HDU 1693 Eat the Trees ——插头DP

    [题目分析] 吃树. 直接插头DP,算是一道真正的入门题目. 0/1表示有没有插头 [代码] #include <cstdio> #include <cstring> #inc ...

  8. hdu 1693 : Eat the Trees 【插头dp 入门】

    题目链接 题意: 给出一个n*m大小的01矩阵,在其中画线连成封闭图形,其中对每一个值为1的方格,线要恰好穿入穿出共两次,对每一个值为0的方格,所画线不能经过. 参考资料: <基于连通性状态压缩 ...

  9. HDU 1693 Eat the Trees

    第一道(可能也是最后一道)插头dp.... 总算是领略了它的魅力... #include<iostream> #include<cstdio> #include<cstr ...

  10. 【HDU】1693 Eat the Trees

    http://acm.hdu.edu.cn/showproblem.php?pid=1693 题意:n×m的棋盘求简单回路(可以多条)覆盖整个棋盘的方案,障碍格不许摆放.(n,m<=11) #i ...

随机推荐

  1. maven引入本地jar不能打入部署包的问题解决

    引入的三方依赖 jar 包, scope 为 system 的包 maven 默认是不打包进去的,需要加这个配置 在pom.xml文件中找到spring-boot-maven-plugin插件,添加如 ...

  2. 前端保存JWT的使用方法

    我们可以将JWT保存在cookie中,也可以保存在浏览器的本地存储里,我们保存在浏览器本地存储中 浏览器的本地存储提供了sessionStorage 和 localStorage 两种,从属于wind ...

  3. Advanced .Net Debugging 2:CLR基础

    一.简介 这是2024新年后我的第一篇文章,也是我的<Advanced .Net Debugging>这个系列的第二篇文章.这篇文章告诉我们为了进行有效的程序调试,我们需要掌握哪些知识.言 ...

  4. 四种色彩模式ARGB_8888、ARGB_4444、 RGB_565、 ALPHA_8

    A:透明度. R:红色. G:绿色. B:蓝色. Bitmap.Config ARGB_8888:有四个8位组成,A,R,G,B各占八位,也就是各占一个字节.也就是一个像素点占4个字节,32位. Bi ...

  5. 关闭mysql上锁的表/数据

    一.输入查询语句,查看是否有数据被上锁 select * from information_schema.innodb_trx; 取 trx_mysql_thread_id 字段值 kill < ...

  6. Java 异常处理(2) : 方法重写的规则之一:

    1 package com.bytezero.throwable; 2 3 import java.io.FileNotFoundException; 4 import java.io.IOExcep ...

  7. 有n步台阶,一次只能上1步或2步,共有多少种走法

    循环迭代:   1 public class steps { 2 public int js(int n) { 3 int one = 2; //初始化为第三级台阶最后跨一步的走法 4 int two ...

  8. Spring事务(一)-事务配置

    事务是数据库操作最基本的单元,是逻辑上的一组操作,这一组操作在同一个会话中要么都执行成功,要么都失败,这也是事务的最基本特性--原子性.事务的作用是为了保证系统数据的正确性,因此,数据库应用程序中是会 ...

  9. 单麦克风AI降噪模块及解决方案

    前记   随着以AI为核心的智能设备的广泛发展,语音这个非常重要的入口一直是很多厂商争夺的市场.作为音频采集的前端设备,能采集到的距离远,清晰度高,无噪声的信号是一个非常重要的能力.这样就对音频前端降 ...

  10. JavaFx 圆形头像实现

    原文:JavaFx 圆形头像实现 - Stars-One的杂货小窝 本文基于TornadoFx框架进行编写,封装工具代码是kotlin版本 圆形头像框组件封装成了stars-one/common-co ...