HDU4285 circuits 插头dp

本文介绍了一种解决HDU4285竞赛题目中涉及的矩阵多回路覆盖问题的方法,利用插头DP算法,考虑了回路数量限制及回路间不可嵌套的要求。

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

原题:HDU4285

题意:N*M有障碍矩阵,“*”为障碍,求用多个回路覆盖所有非障碍点,要求回路之间不能嵌套,求回路数为K的方案数(1 <= n,m <=12)。


插头dp
相比耿直的多回路问题,这题多了两个要求,一是k个回路,二是回路之间不能嵌套。
对于第一个要求,显然,在储存当前轮廓线的插头状态时,还要储存已产生的回路数,最大为K,因为回路至少4格,所以K最大值为12*12/4 = 36,需要6位二进制(写的时候智障地用了8位,影响不大)。
对于第二个要求,在每个状态转移的时候,若轮廓线前面的插头数为奇数,则意味着会产生嵌套,为非法情况。
(1).障碍点
只有没有左,上插头的状态,转移到没有右,下插头的状态
(2).非障碍点

  1. 有左,上插头:如果左,上插头连通,合并左上插头,并且要满足条件2使得轮廓线上该列以前的插头数为偶数,如果左,上插头不连通,合并左上插头,并将轮廓线上的上插头连通块加入到左插头连通块中。
  2. 只有左插头或者只有上插头:延续插头的连通性,转移到只有右插头或只有下插头的状态。
  3. 没有左,上插头:新建连通块,有右,下插头,标号为八进制中的7。

代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 15
#define inf 0x7f7f7f7f
#define mod 1000000007
#define HASH 10007
#define STATE 1000100
typedef long long ll;
int n, m, l;
int code[N], ch[N];
int mp[N][N];

struct HASHMAP
{
    int head[HASH], next[STATE], size;
    ll f[STATE], state[STATE];
    void init() {
        size = 0;
        memset(head, -1, sizeof(head));
    }
    void push(ll st, ll ans) {
        int h = st % HASH;
        for (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值