\(\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的更多相关文章

  1. Solution -「HDU 5498」Tree

    \(\mathcal{Description}\)   link.   给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...

  2. Solution -「HDU 6643」Ridiculous Netizens

    \(\mathcal{Description}\)   Link.   给定一棵含有 \(n\) 个结点的树,点 \(u\) 有点权 \(w_u\),求树上非空连通块的数量,使得连通块内点权积 \(\ ...

  3. Solution -「HDU 1788」CRT again

    \(\mathcal{Description}\)   Link.   解同余方程组: \[x\equiv m_i-a\pmod{m_i} \]   其中 \(i=1,2,\dots,n\).   \ ...

  4. Solution -「HDU #6566」The Hanged Man

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个点的树,每个结点有两个权值 \(a\) 和 \(b\).对于 \(k\in[1,m]\),分别求 \[ ...

  5. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  6. Solution -「HDU」Professor Ben

    Description 有 \(Q\) 个询问.每次给定一个正整数 \(n\),求它的所有因数的质因数个数的和. Solution 就讲中间的一个 Trick. 我们定义正整数 \(x\) 有 \(f ...

  7. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  8. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

  9. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

随机推荐

  1. Hadoop的Shuffle阶段

    原文: https://www.toutiao.com/i6764683672772674062/ 在进入Map之前,首先会将数据从HDFS中读取,进行处理,按照字节偏移量这种之前说的形式处理为K,V ...

  2. Kube-OVN 1.2.0发布,携手社区成员打造高性能容器网络

    Kube-OVN 1.2.0 新版本如期而至,支持 Vlan 和 OVS-DPDK 两种类型的高性能网络接口.本次发布得益于社区的壮大,感谢Intel爱尔兰开发团队与锐捷网络开发团队持续积极参与Kub ...

  3. C#进程调用FFmpeg操作音视频

    项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂 ...

  4. 如何更改Docker已经挂载的目录

    更改docker已经挂载的目录,主要有两种方式:一是重新创建容器,二是更改配置文件.第一种方式较为简单,下面具体演示第二种方式,通过更改配置文件来更换目录 挂载. 安装docker yum -y in ...

  5. Typora 图片上传

    Typora 图片上传 本文借鉴源于:https://zhuanlan.zhihu.com/p/137426939 感谢博主分享 引: 不知道你们平时都在哪里做笔记,本人都是在CSDN Java慈祥 ...

  6. day23 结构体

    (1).若有说明和定义: typedef int *integer: integer p,*q: 则下列叙述正确的是[C] (A).q是基类型位int的指针变量 (B).p是int型变量 (C).p是 ...

  7. Sentry 开发者贡献指南 - 配置 PyCharm

    概述 如果您使用 PyCharm 进行开发,则需要配置一些内容才能运行和调试. 本文档描述了一些对 sentry 开发有用的配置 配置 Python 解释器:(确保它是 venv 解释器)例如 ~/v ...

  8. Python 根据id生成唯一码

    Python 根据id生成唯一码 最近业务中遇到需要分享某个文案,复制文案打开APP需要提取文案中包含的id,但又不想明文暴露id,所以需要对id进行加密,很想让前端来做,可惜多个前端协调起来不方便( ...

  9. Windows和Linux(Centos7)下安装Nginx

    安装Nginx 这篇记录只不过做了一个简单总结,如果对这块没什么概念的话可以看一下知乎的这篇文章 https://zhuanlan.zhihu.com/p/83890573 window下安装 win ...

  10. CMake语法—普通变量与函数(Normal Variable And Function)

    目录 CMake语法-普通变量与函数(Normal Variable And Function) 1 CMake普通变量与函数示例 1.1 CMakeLists.txt 1.2 执行CMake配置脚本 ...