Solution -「HDU 6875」Yajilin
\(\mathcal{Description}\)
Link.(HDU 裂开了先放个私链 awa。)
在一个 \(n\times n\) 的方格图中,格子 \((i,j)\) 有权值 \(w_{i,j}\),现可将一些不相邻的格子染黑,并保证白格子在四联通意义下存在哈密顿回路,方案的价值为染色格子权值之和。求方案的最大价值。
\(n\le10\),数据组数 \(T\le30\)。
\(\mathcal{Solution}\)
Emmm...插头 DP 写得太少了,这题还算比较常规,所以只算记录一个板子叭。
令 \(f(i,j,S)\) 表示正要考虑 \((i,j)\) 时,轮廓线为 \(S\) 的最大价值。轮廓上的每条边有四种状态:无插头、左插头、右插头、黑格子,大力转移即可,注意用 hash 保存状态。
复杂度上界是 \(\mathcal O(n^34^{n+1})\),但显然跑不满√
\(\mathcal{Code}\)
/*~Rainybunny~*/
#include <cstdio>
#include <cassert>
#include <cstring>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
inline void chkmax( int& a, const int b ) { a < b && ( a = b ); }
const int MAXN = 10;
int n, w[MAXN + 5][MAXN + 5];
struct HashTable {
static const int M = 299987;
int node, head[M + 5], nxt[M + 5], key[M + 5], val[M + 5];
inline void clear() {
rep ( i, 1, node ) head[key[i] % M] = 0;
node = 0;
}
inline void operator () ( const int s, const int v ) {
int h = s % M, las = 0;
for ( int i = head[h]; i; i = nxt[las = i] ) {
if ( key[i] == s ) {
return chkmax( val[i], v );
}
}
if ( !las ) head[h] = ++node;
else nxt[las] = ++node;
key[node] = s, val[node] = v, nxt[node] = 0;
}
} S[2];
inline int match( const int s, const int k ) {
int v = s >> k >> k & 3;
if ( v != 1 && v != 2 ) return -1;
if ( v == 1 ) {
int cnt = 1;
rep ( i, k + 1, n ) {
if ( int t = s >> i >> i & 3; t == 1 ) ++cnt;
else if ( t == 2 && !--cnt ) return i;
}
} else {
int cnt = 1;
per ( i, k - 1, 0 ) {
if ( int t = s >> i >> i & 3; t == 2 ) ++cnt;
else if ( t == 1 && !--cnt ) return i;
}
}
return assert( false ), -1;
}
inline bool check( const int s ) {
rep ( i, 0, n ) {
if ( ( s >> i >> i & 3 ) && ( s >> i >> i & 3 ) != 3 ) {
return false;
}
}
return true;
}
inline int solve() {
S[0].clear(), S[0]( 0, 0 );
int ret = 0;
for ( int i = 1, sta = 0; i <= n; ++i ) {
rep ( j, 1, S[sta].node ) {
int d = S[sta].key[j] >> n >> n;
assert( !d || d == 3 );
( S[sta].key[j] ^= d << n << n ) <<= 2;
}
for ( int j = 1; j <= n; ++j, sta ^= 1 ) {
S[!sta].clear();
rep ( k, 1, S[sta].node ) {
int s = S[sta].key[k], v = S[sta].val[k];
int pl = s << 2 >> j >> j & 3, pu = s >> j >> j & 3;
int ql = match( s, j - 1 ), qu = match( s, j );
s ^= ( pl << j << j >> 2 ) ^ ( pu << j << j );
if ( !pl && !pu ) { // b
S[!sta]( s | 15 << j << j >> 2, v + w[i][j] );
if ( i == n && j == n ) chkmax( ret, v + w[i][j] );
}
if ( i < n && j < n
&& ( !pl || pl == 3 ) && ( !pu || pu == 3 ) ) { // rd
S[!sta]( s | 9 << j << j >> 2, v );
}
if ( pl == 1 && pu == 2 && check( s ) ) { // lu, upd
if ( i == n && j == n ) chkmax( ret, v );
else if ( i == n && j == n - 1 && !( s >> n >> n & 3 ) ) {
chkmax( ret, v + w[n][n] );
}
}
if ( i < n && ( !pl || pl == 3 )
&& ( pu == 1 || pu == 2 ) ) { // u-d
S[!sta]( s | pu << j << j >> 2, v );
}
if ( j < n && ( pl == 1 || pl == 2 )
&& ( !pu || pu == 3 ) ) { // l-r
S[!sta]( s | pl << j << j, v );
}
if ( j < n && ( !pl || pl == 3 )
&& ( pu == 1 || pu == 2 ) ) { // u-r
S[!sta]( s | pu << j << j, v );
}
if ( i < n && ( pl == 1 || pl == 2 )
&& ( !pu || pu == 3 ) ) { // l-d
S[!sta]( s | pl << j << j >> 2, v );
}
if ( ~ql && ql != j && ~qu && qu != j - 1 ) { // lu
if ( pl == pu && pl == 1 ) {
S[!sta]( s ^ 3 << qu << qu, v );
} else if ( pl == pu && pl == 2 ) {
S[!sta]( s ^ 3 << ql << ql, v );
} else {
S[!sta]( s, v );
}
}
}
}
}
return ret;
}
int main() {
int T;
for ( scanf( "%d", &T ); T--; ) {
scanf( "%d", &n );
rep ( i, 1, n ) rep ( j, 1, n ) scanf( "%d", &w[i][j] );
printf( "%d\n", solve() );
}
return 0;
}
Solution -「HDU 6875」Yajilin的更多相关文章
- Solution -「HDU 5498」Tree
\(\mathcal{Description}\) link. 给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...
- Solution -「HDU 6643」Ridiculous Netizens
\(\mathcal{Description}\) Link. 给定一棵含有 \(n\) 个结点的树,点 \(u\) 有点权 \(w_u\),求树上非空连通块的数量,使得连通块内点权积 \(\ ...
- Solution -「HDU 1788」CRT again
\(\mathcal{Description}\) Link. 解同余方程组: \[x\equiv m_i-a\pmod{m_i} \] 其中 \(i=1,2,\dots,n\). \ ...
- Solution -「HDU #6566」The Hanged Man
\(\mathcal{Description}\) Link. 给定一棵含 \(n\) 个点的树,每个结点有两个权值 \(a\) 和 \(b\).对于 \(k\in[1,m]\),分别求 \[ ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「HDU」Professor Ben
Description 有 \(Q\) 个询问.每次给定一个正整数 \(n\),求它的所有因数的质因数个数的和. Solution 就讲中间的一个 Trick. 我们定义正整数 \(x\) 有 \(f ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「BZOJ 3812」主旋律
\(\mathcal{Description}\) Link. 给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
随机推荐
- div背景css样式笔记
<style type="text/css"> .div1 { width: 1024px; height: 100%; margin: 0 auto; /*backg ...
- 使用 navigator.userAgent.toLowerCase() 区别 浏览器 类型
userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值 var ua = navigator.userAgent.toLowerCase(); 返回的是个字符串 ...
- SYCOJ1717负二进制
题目-负二进制 (shiyancang.cn) 进制的实质在于对于进制数的选择,选择不满足的填入当前的位置,然后除掉,继续开始选择.但是对于本题,是负数,但是进制上的数字为正数,所以就要调整,借位,因 ...
- Flowable实战(一)启动第一个完整流程
一.前言: 发现网上关于Flowable的资料基本都是浅尝辄止,对如何构建一个企业级的流程应用说明很少,所以写个实战系列,希望对大家和自己,都有所帮助. 二.认识Flowable Flowab ...
- 论文翻译:2020_FLGCNN: A novel fully convolutional neural network for end-to-end monaural speech enhancement with utterance-based objective functions
论文地址:FLGCNN:一种新颖的全卷积神经网络,用于基于话语的目标函数的端到端单耳语音增强 论文代码:https://github.com/LXP-Never/FLGCCRN(非官方复现) 引用格式 ...
- 【golang学习记录】环境搭建
[golang学习记录]环境搭建 一. 概述 本文是[golang学习记录]系列文章的第一篇,安装Go语言及搭建Go语言开发环境,接下来将详细记录自己学习 go 语言的过程,一方面是为了巩固自己学到的 ...
- [开发笔记usbTOcan]软件需求分析和软件架构设计
前面文章进行了系统分析和系统架构设计,手工焊接了一个板子,集合EK-TMC123GXL开发板(请忽略焊接技术) SWE.1 | 软件需求分析 软件需求分析过程的目的是将系统需求的软件相关部分转化为一组 ...
- [USB波形分析] 全速USB波形数据分析(一)
在之前的文章一次CAN波形分析之旅里,根据示波器采集的波形数据,详细地分析了CAN通信.今天来分析USB数据,还是同样的流程,但是这次使用matplotlib来协助分析. USB基本波形 USB通过一 ...
- mate10碎屏机当成小电脑使用尝试
1.屏碎了修起来300-400,自己动手至少也要260以上买个屏幕钱. 手机图案锁屏也不知道密码,给我手机的亲戚忘了.当年手机被车压弯了. 对着恢复教程,盲屏幕猜着按还原了. 2.之后一路从8代系统更 ...
- 使用 fail2ban 保护 frp 服务
背景 我们一般会使用 fail2ban 来保护暴露到公网的提供密码登录的 ssh 连接等. 但使用 frp 穿透后所有的从外网访问都会变成 127.0.0.1 进入的,原本能用 fail2ban 保护 ...