[JLOI2009]神秘的生物

只需要维护连通情况,采用最小表示法,表示此格是否存在,也即插头是否存在

分情况讨论当前格子的轮廓线上方格子和左方格子状态,转移考虑当前格子选不选,决策后状态最后要能合法

\(\text{Code}\)

$\text{Code}$
#include <bits/stdc++.h>
#define IN inline
using namespace std; const int N = 15;
int bit[N], a[N][N], ans = -2e9, n; struct Hash_Table {
#define mod 590027
struct edge{int nxt, sta, f;}e[1 << 24];
int h[mod + 5], tot;
IN void clear(){tot = 0, memset(h, 0, sizeof h);}
IN void insert(int s, int v) {
int id = s % mod;
for(int i = h[id], x; i; i = e[i].nxt)
if (e[i].sta == s) return e[i].f = max(e[i].f, v), void();
e[++tot] = edge{h[id], s, v}, h[id] = tot;
}
}hs[2]; IN int Recode(int s, int v) {
int vis[8] = {}, cnt = 0, t = 0;
for(int i = 0, x; i < n; i++) {
if (!(x = (s >> 3*i) & 7)) continue;
if (!vis[x]) vis[x] = ++cnt;
t += vis[x] * bit[i];
}
if (cnt == 1) ans = max(ans, v);
return t;
}
IN int Count(int s, int v) {
int res = 0;
for(int i = 0; i < n; i++) if (((s >> 3*i) & 7) == v) ++res;
return res;
} void solve() {
int cur = 0; hs[cur].insert(0, 0);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
hs[cur^1].clear();
for(int k = 1; k <= hs[cur].tot; k++) {
int curS = hs[cur].e[k].sta, curF = hs[cur].e[k].f;
int bd = (curS >> 3*(j - 1)) & 7, br = 0;
if (j > 1) br = (curS >> 3*(j - 2)) & 7;
if (!bd && !br) {
hs[cur^1].insert(Recode(curS, curF), curF);
hs[cur^1].insert(Recode(curS + 7*bit[j-1], curF + a[i][j]), curF + a[i][j]);
}
else if (!bd && br) {
hs[cur^1].insert(Recode(curS, curF), curF);
hs[cur^1].insert(Recode(curS + br*bit[j-1], curF + a[i][j]), curF + a[i][j]);
}
else if (bd && !br) {
hs[cur^1].insert(Recode(curS, curF + a[i][j]), curF + a[i][j]);
if (Count(curS, bd) >= 2) hs[cur^1].insert(Recode(curS - bd*bit[j-1], curF), curF);
}
else {
if (Count(curS, bd) >= 2) hs[cur^1].insert(Recode(curS - bd*bit[j-1], curF), curF);
if (br != bd) for(int w = 0; w < n; w++) if (((curS >> 3*w) & 7) == bd) curS += bit[w] * (br - bd);
hs[cur^1].insert(Recode(curS, curF + a[i][j]), curF + a[i][j]);
}
}
cur ^= 1;
}
} int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) scanf("%d", &a[i][j]), ans = max(ans, a[i][j]);
bit[0] = 1;
for(int i = 1; i <= n; i++) bit[i] = bit[i - 1] << 3;
solve(), printf("%d\n", ans);
}

插头dp 模板的更多相关文章

  1. 插头DP模板

    /* 插头dp模板 抄的GNAQ 的 括号表示法 */ #include<cstdio> #include<algorithm> #include<cstring> ...

  2. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 351[Submit][Sta ...

  3. hdu1964之插头DP求最优值

    Pipes Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  4. 【HDU】1693:Eat the Trees【插头DP】

    Eat the Trees Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  5. 插头dp练习

    最近学了插头dp,准备陆续更新插头dp类练习. 学习论文还是cdq那篇<基于连通性状态压缩的动态规划问题>. 基本的想法都讲得很通透了,接下来就靠自己yy了. 还有感谢kuangbin大大 ...

  6. 学习笔记:插头DP

    基于连通性的状压DP问题. 一般是给你一个网格,有一些连通性的限制. 例题 插头DP模板 链接 题意:网格图,去掉一些点,求哈密顿回路方案数. 一般按格递推(从上到下,从左到右). 每个格子要从四个方 ...

  7. 模板:插头dp

    前言: 严格来讲有关dp的都不应该叫做模板,因为dp太活了,但是一是为了整理插头dp的知识,二是插头dp有良好的套路性,所以姑且还叫做模板吧. 这里先推荐一波CDQ的论文和这篇博客http://www ...

  8. LG5056 【模板】插头dp

    题意 题目背景 ural 1519 陈丹琦<基于连通性状态压缩的动态规划问题>中的例题 题目描述 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 输 ...

  9. P5056 【模板】插头dp

    \(\color{#0066ff}{ 题目描述 }\) 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? \(\color{#0066ff}{输入格式}\) 第1 ...

  10. 【模板】插头dp

    题目描述 题解: 插头$dp$中经典的回路问题. 首先了解一下插头. 一个格子,上下左右四条边对应四个插头.就像这样: 四个插头. 一个完整的哈密顿回路,经过的格子一定用且仅用了两个插头. 所以所有被 ...

随机推荐

  1. Go 的windows安装与环境配置

    1.请前往go的官网下载安装包:https://golang.org/dl/ 安装你如果C盘够大比较土豪就一路next即可,在这里小编穷就安装到了D:\Program Files\Go 2.环境变量配 ...

  2. Kubernetes(K8S) 配置管理-ConfigMap 介绍

    作用:存储不加密数据到 etcd,让 Pod 以变量或者 Volume 挂载到容器中 场景:配置文件 创建配置文件 redis.properties redis.host=127.0.0.1 redi ...

  3. 组件封装----useImperativeHandle和ref

    useImperativeHandle(ref, createHandle, [deps]) 作用: 减少暴露给父组件获取的DOM元素属性, 只暴露给父组件需要用到的DOM方法 参数1: 父组件传递的 ...

  4. JavaScript:函数:函数的参数

    声明函数的时候,有个括号,这里面可以加上函数的参数,这些参数,我们叫做形参(形式参数): 此时这些参数,也是已经声明了的变量,只是还没有赋值而已. 也可以不加,取决于函数的逻辑.如果函数需要从外部传进 ...

  5. NSSCTF_HUBUCTF的web部分题解

    checkin 题目: 主要是php弱比较和序列化知识点考察 <?php $username = "this_is_secret"; $password = "th ...

  6. 6、SQL模糊查询LIKE concat用法

    concat用来拼接查询的字符串: SELECT * FROM `page_demo` WHERE name LIKE concat('%',#{name},'%') 模糊查询: 1.%代表零个或多个 ...

  7. All in one入门之All in one和三种PVE、ESXI、Windows Server方案

    前言 All in one 前段时间,在某多多上花了446大洋弄了一台J4125准系统小主机,再花了一点钱买个杂牌msata和"全新"三星内存条,入坑了All in one. Al ...

  8. 基于jQuery的三种AJAX请求

    基于jQuery的三种AJAX请求 1. 介绍 get请求 通常用于 获取服务端资源(向服务器要资源) ​ 例如:根据URL地址,从服务器获取HTML文件.CSS文件.JS文件.图片文件.数据资源等. ...

  9. SAP-FI模块 如何处理自动生成会计凭证增强

    一. 相关问题概览 1. 固定资产业务过渡科目摘要增强功能-F-02     需用表BKPF.BSEG.T001.通过BUKRS.BELNR.GJAHR三个字段相等关联BKPF与BSEG.通过BKPF ...

  10. 为什么 java 容器推荐使用 ExitOnOutOfMemoryError 而非 HeapDumpOnOutOfMemoryError ?

    前言 好久没写文章了, 今天之所以突然心血来潮, 是因为昨天出现了这样一个情况: 我们公司的某个手机APP后端的用户(customer)微服务出现内存泄露, 导致OutOfMemoryError, 但 ...