【题目大意】

在n*m的网格中选一条回路,使权值和最大。

【思路】

和之前裸的插头DP差不多,只不过现在回路不需要经过所有的格子。所以有以下几个注意点(具体看注释):

(1)left和up插头相等的时候,直接更新答案;

(2)left和up插头不存在的时候,还要考虑当前格子不取的情况。

orz写了半天,感觉被掏空.jpg

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=;
const int MAXM=;
const int HASH=;
const int INF=0x7fffffff;
ll ans=-1ll << ;
int n,m,sat[MAXM][MAXN];
int code[MAXN]; struct HashMap
{
vector<int> hash[HASH];
vector<ll> state,f; void clear()
{
for(int i=;i<HASH;i++) vector<int>().swap(hash[i]);
vector<ll>().swap(state);
vector<ll>().swap(f);
} void push(ll st,ll ans)
{
int h=st%HASH;
for (int i=;i<hash[h].size();i++)
{
int now=hash[h][i];
if (state[now]==st)
{
f[now]=max(f[now],ans);
return;
}
}
state.push_back(st);
f.push_back(ans);
hash[h].push_back(state.size()-);
}
}dp[]; void decode(ll state)
{
memset(code,,sizeof(code));
for (int i=n;i>=;i--)
{
code[i]=state&;
state>>=;
}
} void shift()
{
for (int i=n;i>;i--) code[i]=code[i-];
code[]=;
} ll encode()
{
int ch[MAXN],cnt=;
memset(ch,-,sizeof(ch));
ch[]=;
ll ret=;
for (int i=;i<=n;i++)
{
if (ch[code[i]]==-) ch[code[i]]=++cnt;
code[i]=ch[code[i]];
ret<<=;
ret|=code[i];
}
return ret;
} void dpblank(int i,int j,int cur)
{
for (int k=;k<dp[-cur].state.size();k++)
{
decode(dp[-cur].state[k]);
if (j==)//把之前shift的写法改成这样写了,总之就过了,也不知道为什么orz
{
if (code[n]) continue;
shift();
}
int left=code[j-],up=code[j]; if (left && up)
{
code[j-]=code[j]=;
if (left==up)
{
if (encode()==) ans=max(ans,dp[-cur].f[k]+sat[i][j]);
//注意和之前不一样的地方:如果已经封闭起来了就更新答案
}
else
{
for (int t=;t<=n;t++) if (code[t]==left) code[t]=up;
dp[cur].push(encode(),dp[-cur].f[k]+sat[i][j]);
}
} if ((left && (!up)) || (up && (!left)))
{
int t=left|up;
code[j-]=;
code[j]=t;
dp[cur].push(encode(),dp[-cur].f[k]+sat[i][j]);
code[j-]=t;
code[j]=;
dp[cur].push(encode(),dp[-cur].f[k]+sat[i][j]);
} if (!left && !up)
{
dp[cur].push(encode(),dp[-cur].f[k]);
//注意并不一定是所有格子都要经过,所以还要考虑不经过当前格子的情况
code[j-]=code[j]=MAXN-;
dp[cur].push(encode(),dp[-cur].f[k]+sat[i][j]);
}
}
} void init()
{
scanf("%d%d",&m,&n);
for (int i=;i<=m;i++)
for (int j=;j<=n;j++) scanf("%d",&sat[i][j]);
} void solve()
{
int cur=;
dp[cur].clear();
dp[cur].push(,);
for (int i=;i<=m;i++)
for (int j=;j<=n;j++)
{
cur^=;
dp[cur].clear();
dpblank(i,j,cur);
}
printf("%lld",ans);
} int main()
{
init();
solve();
return ;
}

【插头DP】BZOJ1187- [HNOI2007]神奇游乐园的更多相关文章

  1. [bzoj1187][HNOI2007]神奇游乐园_插头dp

    bzoj-1187 HNOI-2007 神奇游乐园 题目大意:经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这 ...

  2. BZOJ1187 [HNOI2007]神奇游乐园(插头dp)

    麻麻我会写插头dp了! 推荐陈丹琦论文:https://wenku.baidu.com/view/3e90d32b453610661ed9f4bd.html 破题调一年 #include <cs ...

  3. [bzoj1187][HNOI2007]神奇游乐园

    来自FallDream的博客,未经允许,请勿转载,谢谢, 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一 ...

  4. 【BZOJ1187】[HNOI2007]神奇游乐园 插头DP

    [BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...

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

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

  6. 洛谷 P3190 [HNOI2007]神奇游乐园 解题报告

    P3190 [HNOI2007]神奇游乐园 Description 给你一个 \(m * n\) 的矩阵,每个矩阵内有个权值\(V(i,j)\) (可能为负数),要求找一条回路,使得每个点最多经过一次 ...

  7. [HNOI2007]神奇游乐园(插头DP)

    题意:n*m的矩阵内值有正有负,找一个四连通的简单环(长度>=4),使得环上值的和最大. 题解:看到2<=m<=6和简单环,很容易想到插头DP,设f[i][j][k]表示轮廓线为第i ...

  8. 洛谷P3190 [HNOI2007]神奇游乐园(插头dp)

    传送门 大概是算第一道自己做出来的插头dp? (虽然都是照着抄板子的) (虽然有个地方死活没调出来最后只能看题解才发现自己错在哪里的) 我就当你们都会插头dp了…… 因为必须得是一条路径,所以扫描线上 ...

  9. 【bzoj1187】 HNOI2007—神奇游乐园

    http://www.lydsy.com/JudgeOnline/problem.php?id=1187 (题目链接) 题意 一个$n*m$的矩阵,其中每一个位置有一个权值,求一条回路使得经过的位置的 ...

随机推荐

  1. NYOJ 117 求逆序数 (树状数组)

    题目链接 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出 ...

  2. HDU 1521 排列组合 (母函数)

    题目链接 Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB&qu ...

  3. low逼三人组、nb二人组、归并、希尔排序----小结

  4. 商城项目(ssm+dubbo+nginx+mysql统合项目)总结(3)

    我不会在这里贴代码和详细步骤什么的,我觉得就算我把它贴出来,你们照着步骤做还是会出很多问题,我推荐你们去看一下黑马的这个视频,我个人感觉很不错,一步一步走下来可以学到很多东西.另外,视频和相关文档的话 ...

  5. python操作上级子文件

    . └── folder ├── data │ └── data.txt └── test1 └── test2 └── test.py import os '***获取当前目录***'print o ...

  6. redis+cookie+json+filter实现单点登录

    目录: 1.项目集成redis客户端jedis 引入Jedis pom 2.redis连接池构建及调试 1)JedisPoolConfig源码解析 2)JedisPool源码解析 3)JedisPoo ...

  7. Java Eclipse 配置

    1.清除多余记录 最近用eclipse打包jar的时候,需要指定一个main函数.需要先运行一下main函数,eclipse的Runnable JAR File Specification 下的Lau ...

  8. Spring中的@Transactional事务注解

    事务注解方式 @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: @Transactional public class TestServiceBean impl ...

  9. linux nginx php-fpm被攻击

    1.nginx错误日志:报错 2018/05/30 16:30:55 [error] 8765#0: *1485 connect() to unix:/tmp/php-70-cgi.sock fail ...

  10. LightOJ 1319 Monkey Tradition(中国剩余定理)

    题目链接:https://vjudge.net/contest/28079#problem/U 题目大意:给你n(n<12)行,每行有pi,ri,求一个数ans满足ans%pi=ri(i从1~n ...