【题意】给定m*n的整数矩阵,求经过所有点至多一次路径的最大数值和。n<=8,m<=100。

【算法】插头DP

【题解】最小表示法确实十分通用,处理简单路径问题只需要状态多加一位表示独立插头的数量0~2(即路径端点),转移的时候多考虑凭空产生独立插头和结尾为独立插头的情况即可。

可以跳格的情况直接转移就行。求最值路径和求路径数的区别就是把加改成乘。这样每行至多5种联通编号,用8进制即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,MOD=,S=;
int n,m,map[][maxn],c[maxn],num;
struct h{
int first[MOD],nxt[S],state[S],tot;//
ll ans[S];
void init(){
memset(first,,sizeof(first));
tot=;
}
void insert(int x,ll num){
for(int i=first[x%MOD];i;i=nxt[i]){
if(state[i]==x){
ans[i]=max(ans[i],num);
return;
}
}
state[++tot]=x;ans[tot]=num;
nxt[tot]=first[x%MOD];first[x%MOD]=tot;
}
}f[];
void decode(int x){num=x&;x>>=;for(int i=m;i>=;i--)c[i]=x&,x>>=;}
int vis[];//
int encode(){
for(int i=;i<=;i++)vis[i]=;
int cnt=,x=;
for(int i=;i<=m;i++){
if(!c[i]){x<<=;continue;}
if(!vis[c[i]])vis[c[i]]=++cnt;
x=(x<<)|vis[c[i]];
}
return x=(x<<)|num;
}
bool o(int x,int y){return x<=n&&y<=m;}
void solve(int cur,int x,int y){
for(int k=;k<=f[cur^].tot;k++){
decode(f[cur^].state[k]);
int left=c[y-],up=c[y];ll ans=f[cur^].ans[k]+map[x][y];
if(left&&up){
if(left!=up){
c[y-]=c[y]=;
for(int i=;i<=m;i++)if(c[i]==left)c[i]=up;
f[cur].insert(encode(),ans);
}
}
else if(left||up){
int now=left^up;
if(o(x+,y)){
c[y-]=now;c[y]=;
f[cur].insert(encode(),ans);
}
if(o(x,y+)){
c[y-]=;c[y]=now;
f[cur].insert(encode(),ans);
}
if(num<){
num++;c[y-]=c[y]=;
f[cur].insert(encode(),ans);
}
}
else{
f[cur].insert(encode(),f[cur^].ans[k]);
if(o(x+,y)&&o(x,y+)){
c[y-]=c[y]=;
f[cur].insert(encode(),ans);
}
if(num<){
num++;
if(o(x+,y)){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
if(o(x,y+)){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
}
}
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)for(int j=;j<=m;j++)scanf("%d",&map[i][j]);
int cur=;f[].init();f[].insert(,);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
f[cur^=].init();solve(cur,i,j);
}
for(int j=;j<=f[cur].tot;j++){
int num=f[cur].state[j]&;
f[cur].state[j]=((f[cur].state[j]>>)<<)|num;//
}
}
ll ANS=-1ll<<;
for(int i=;i<=f[cur].tot;i++){
if((f[cur].state[i]&)==)ANS=max(ANS,f[cur].ans[i]);
}
printf("%lld",ANS);
return ;
}

注意桶数组vis开成int类型,奇怪的问题一定是数组空间的问题。

【BZOJ】2310: ParkII 插头DP的更多相关文章

  1. 【BZOJ2310】ParkII 插头DP

    [BZOJ2310]ParkII Description Hnoi2007-Day1有一道题目 Park:给你一个 m * n 的矩阵,每个矩阵内有个权值V(i,j) (可能为负数),要求找一条回路, ...

  2. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...

  3. BZOJ.1210.[HNOI2004]邮递员(插头DP Hash 高精)

    BZOJ 洛谷 http://www.cnblogs.com/LadyLex/p/7326874.html 插头DP.\(m+1\)个插头的状态需要用三进制表示:\(0\)表示无插头,\(1\)表示是 ...

  4. bzoj 1187: [HNOI2007]神奇游乐园 插头dp

    1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 668  Solved: 337[Submit][Statu ...

  5. bzoj 2331: [SCOI2011]地板 插头DP

    2331: [SCOI2011]地板 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 541  Solved: 239[Submit][Status] D ...

  6. bzoj 1210 [HNOI2004] 邮递员 插头dp

    插头dp板子题?? 搞了我一晚上,还tm全是抄的标程.. 还有高精,哈希混入,还是我比较弱,orz各种dalao 有不明白的可以去看原论文.. #include<cstdio> #incl ...

  7. bzoj 1814 Ural 1519 Formula 1 ——插头DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 ...

  8. 【BZOJ】2331: [SCOI2011]地板 插头DP

    [题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...

  9. 【题解】互不侵犯 SCOI 2005 BZOJ 1087 插头dp

    以前没学插头dp的时候觉得这题贼难,根本不会做,学了才发现原来是一裸题. 用二进制表示以前的格子的状态,0表示没放国王,1表示放了国王. 假设当前位置为(x,y),需要记录的是(x-1,y-1)至(x ...

随机推荐

  1. 《简明Python教程》学习笔记

    <简明Python教程>是网上比较好的一个Python入门级教程,尽管版本比较老旧,但是其中的基本讲解还是很有实力的. Ch2–安装Python:下载安装完成后,在系统的环境变量里,在Pa ...

  2. Oracle中SYS_CONNECT_BY_PATH函数的妙用 ;

    Oracle 中SYS_CONNECT_BY_PATH函数是非常重要的函数,下面就为您介绍一个使用SYS_CONNECT_BY_PATH函数的例子,实例如下: 数据准备: ),b )); ', 'A' ...

  3. Node初识笔记 1第一周

    #下载安装好node > https://nodejs.org/en/ #  打开cmd  调整好执行路径 . 1.js是JS文件名,cd调招路径,‘node’+空格 +JS文件名(带上扩展名) ...

  4. JS 随机整数

    <script>   function GetRandomNum(Min,Max){   var Range = Max - Min;   var Rand = Math.random() ...

  5. getcontext makecontext setcontext swapcontext介绍

    ucontext簇函数学习 https://github.com/zfengzhen/Blog/blob/master/article/ucontext%E7%B0%87%E5%87%BD%E6%95 ...

  6. p2 碰撞

    P2可以实现物体碰撞模拟,同时在碰撞过程中派发一些事件实现碰撞检测,将碰撞信息及时反馈,以添加相应的特效. P2中,当两个刚体的最小包围盒AABB发生重叠,碰撞就开始了:然后刚体的形状发生重叠,同时P ...

  7. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

  8. WampServer3.0允许局域网访问配置教程

    wamp server 下的Apache默认设置是不允许外网访问和局域网访问的,而直接搜索 wamp局域网访问配置,出现都是一些旧版本的wamp的配置信息,最新版本3.0.X需要使用以下配置方法: 配 ...

  9. 【刷题】BZOJ 3144 [Hnoi2013]切糕

    Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...

  10. 【bzoj2876】 Noi2012—骑行川藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2876 (题目链接) 题意 在满足约束条件$${\sum_{i=1}^ns_ik_i(v_i-v_i' ...