插头dp 模板
[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 模板的更多相关文章
- 插头DP模板
/* 插头dp模板 抄的GNAQ 的 括号表示法 */ #include<cstdio> #include<algorithm> #include<cstring> ...
- bzoj1814 Ural 1519 Formula 1(插头dp模板题)
1814: Ural 1519 Formula 1 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 924 Solved: 351[Submit][Sta ...
- hdu1964之插头DP求最优值
Pipes Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 【HDU】1693:Eat the Trees【插头DP】
Eat the Trees Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 插头dp练习
最近学了插头dp,准备陆续更新插头dp类练习. 学习论文还是cdq那篇<基于连通性状态压缩的动态规划问题>. 基本的想法都讲得很通透了,接下来就靠自己yy了. 还有感谢kuangbin大大 ...
- 学习笔记:插头DP
基于连通性的状压DP问题. 一般是给你一个网格,有一些连通性的限制. 例题 插头DP模板 链接 题意:网格图,去掉一些点,求哈密顿回路方案数. 一般按格递推(从上到下,从左到右). 每个格子要从四个方 ...
- 模板:插头dp
前言: 严格来讲有关dp的都不应该叫做模板,因为dp太活了,但是一是为了整理插头dp的知识,二是插头dp有良好的套路性,所以姑且还叫做模板吧. 这里先推荐一波CDQ的论文和这篇博客http://www ...
- LG5056 【模板】插头dp
题意 题目背景 ural 1519 陈丹琦<基于连通性状态压缩的动态规划问题>中的例题 题目描述 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 输 ...
- P5056 【模板】插头dp
\(\color{#0066ff}{ 题目描述 }\) 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? \(\color{#0066ff}{输入格式}\) 第1 ...
- 【模板】插头dp
题目描述 题解: 插头$dp$中经典的回路问题. 首先了解一下插头. 一个格子,上下左右四条边对应四个插头.就像这样: 四个插头. 一个完整的哈密顿回路,经过的格子一定用且仅用了两个插头. 所以所有被 ...
随机推荐
- 一个有趣的nginx HTTP 400响应问题分析
背景 之前在一次不规范HTTP请求引发的nginx响应400问题分析与解决 中写过客户端query参数未urlencode导致的400问题,当时的结论是: 对于query参数带空格的请求,由于其不符合 ...
- web项目的开发--第一天
如何分析需求.如何设计.编码实现.测试. 用ssm架构实现CRM项目代码编写. CRM项目: 关键是养成好的编程思想和编程习惯. 技术架构 视图层(view): 展示数据,跟用户交互. html,cs ...
- Keras网络可视化方法
Keras网络可视化方法 Keras模型可视化 Keras可视化依赖的两个包 参考链接 Keras模型可视化 代码: from keras.utils import plot_model plot_m ...
- Curve 块存储应用实践 -- iSCSI
Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易数帆发起开源的高性能.易运维.云原生的分布式存储系统. 为了让大家更容易使用以及了解 Curve,我们期望接下来通过系列应用实 ...
- 【基于OpenAI的ChatGPT】搭建属于自己的微信聊天机器人(附带注册英国手机号码方式)
前言:这几天 OpenAI的聊天机器人很火,前两天也爆发了很多关于ChatGPT接入微信的文章.我就顺便[借用别人已有的项目],来部署一个属于自己的微信聊天机器人.项目地址见下文. 1.首先需要有一个 ...
- C#深拷贝方法
概述 为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做. 方法一(利用反射实现 ...
- 出现报错:The field admin.LogEntry.user was declared with a lazy reference to 'api.user', but app 'api' isn't installed.解决方法
- 在Windows服务器安装禅道
1.服务器上 浏览器打开禅道官网:https://www.zentao.net/ 2.下载禅道版本,这里安装的是开源版 3.下载完成之后,一键安装 安装完成之后,即可访问:
- nuxt 登录注册加重置密码
<!-- 登录弹框 --> <div class="mask" v-show="flag"> <div class="m ...
- Java基础篇——常用类
Objec类 Test t1 = new Test(); Test t2 = new Test(); //toString方法,对某个对象的字符串输出 //getClass方法,返回该对象的Class ...