插头dp/轮廓线dp

本文介绍了两种基于动态规划的插头dp问题,包括Ural 1519和HDU1693题目。这些问题是关于在一定限制下,如何在n*m的方格中形成闭合回路的计数问题。通过哈希map实现状态压缩,分别讨论了只有一个闭合回路和可以有多个闭合回路的情况,并提供了输入输出样例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先%mmh学长。
这个东西还好吧。。。。
也算是个状压,难的也不会,就会写个板子题。
用哈希map代替了哈希表。
一、P5056 【模板】插头dp:
题目背景
ural 1519

陈丹琦《基于连通性状态压缩的动态规划问题》中的例题

题目描述
给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路。问有多少种铺法?

输入格式
第1行,n,m(2<=n,m<=12)

从第2行到第n+1行,每行一段字符串(m个字符),"*“表不能铺线,”."表必须铺

输出格式
输出一个整数,表示总方案数

输入输出样例
输入 #1 复制
4 4
**…



输出 #1 复制
2
输入 #2 复制
4 4




输出 #2 复制
6

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<map>
#include<unordered_map>
#define ll long long
#define llu unsigned ll
using namespace std;
const int maxn=20;
const int maxx=2000100;
const int mod=4;
char str[maxn][maxn];
int pm[maxn][maxn],n,m,ex,ey;
int b[maxn],bm[maxn];
int cnt[2],sta[2][maxx],k=0;
unordered_map<int,ll>dp[2];
ll ans=0;

void init(void)
{
   
    for(int i=0;i<=13;i++)
        b[i]=(i<<1);
    for(int i=0;i<=13;i++)
        bm[i]=(1<<b[i]);
}

void in(int nowsta,ll sum)
{
   
    if(dp[k].find(nowsta)==dp[k].end())
    {
   
        sta[k][++cnt[k]]=nowsta;
        dp[k][nowsta]=sum;
    }
    else dp[k][nowsta]+=sum;
}

void DP(void)
{
   
    cnt[k]=1;
    dp[k][0]=1;
    sta[k][1]=0;
    for(int i=1;i<=n;i++)
    {
   
        for(int j=1;j<=m;j++)
        {
   
            int p=k;
            k^=1;
            dp[k].clear();
            cnt[k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值