http://www.lydsy.com/JudgeOnline/problem.php?id=1187 (题目链接)

题意

  一个$n*m$的矩阵,其中每一个位置有一个权值,求一条回路使得经过的位置的权值和最大。

Solution

  插头dp,插头维护连通信息,更新答案的条件就是合并的左插头和右插头属于同一连通块,且当前状态已经没有其它插头了。更新完答案后这个状态不会再被记入下一次dp。

代码

// bzoj1185
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define HAS 6311
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxd=10,maxs=100010,maxh=6400;
int code[maxd],cnts[maxd],n,m;
int head[maxh],next[maxs];
int size[2],tot[2][maxs],s[2][maxs]; void decode(int st) {
for (int i=m;i>=0;i--) code[i]=st&7,st>>=3;
}
int encode() {
int st=0,cnt=0;
memset(cnts,-1,sizeof(cnts));cnts[0]=0;
for (int i=0;i<=m;i++) {
if (cnts[code[i]]==-1) cnts[code[i]]=++cnt;
code[i]=cnts[code[i]];
}
for (int i=0;i<=m;i++) st=st<<3|code[i];
return st;
}
void shift() {
for (int i=m;i;i--) code[i]=code[i-1];code[0]=0;
}
void add(int p,int num) {
int st=encode();
int id=st%HAS;
for (int i=head[id];i;i=next[i])
if (s[p][i]==st) {tot[p][i]=max(tot[p][i],num);return;}
s[p][++size[p]]=st;tot[p][size[p]]=num;
next[size[p]]=head[id];head[id]=size[p];
}
int main() {
scanf("%d%d",&n,&m);
int p=0,ans=-inf,val;
size[0]=1;tot[0][1]=0;s[0][1]=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
scanf("%d",&val);
size[p^=1]=0;
memset(head,0,sizeof(head));
for (int k=1;k<=size[p^1];k++) {
decode(s[p^1][k]);
int left=code[j-1],up=code[j];
if (left && up) {
if (left==up) {
int flag=0;
for (int l=0;l<j-1;l++) if (code[l]) {flag=1;break;}
for (int l=j+1;l<=m;l++) if (code[l]) {flag=1;break;}
if (!flag) ans=max(ans,tot[p^1][k]+val);
}
else {
code[j-1]=code[j]=0;
for (int l=0;l<=m;l++) if (code[l]==up) code[l]=left;
if (j==m) shift();
add(p,tot[p^1][k]+val);
}
}
else if (left || up) {
int tmp=left ? left : up;
if (j<m) {
code[j-1]=0,code[j]=tmp;
add(p,tot[p^1][k]+val);
}
if (i<n) {
code[j-1]=tmp,code[j]=0;
if (j==m) shift();
add(p,tot[p^1][k]+val);
}
}
else {
if (i<n && j<m) {
code[j-1]=code[j]=8;
add(p,tot[p^1][k]+val);
}
code[j-1]=code[j]=0;
if (j==m) shift();
add(p,tot[p^1][k]);
}
}
}
printf("%d",ans);
return 0;
}

【bzoj1187】 HNOI2007—神奇游乐园的更多相关文章

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

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

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

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

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

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

  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. BZOJ1187:[HNOI2007]神奇游乐园——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1187 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现 ...

  8. 1187: [HNOI2007]神奇游乐园 - BZOJ

    Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一个游乐场,专为旅途中疲惫的人设计. ...

  9. bzoj:1187: [HNOI2007]神奇游乐园

    Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一个游乐场,专为旅途中疲惫的人设计. ...

随机推荐

  1. Linux系统中时间区域和API

    1.问题 在开发云平台程序的时候,经常会碰到时间区域转换的问题.比如,任何网络存储的文档的metadata都自己记录了编辑时间.但是,云平台记录时需要把这个时间转成标准时间,便于管理.但是用户使用的时 ...

  2. skipfish介绍

    skipfish 开发语言:C语言 命令行扫描器 主动扫描web安全评估工具 谷歌开发 已经不再进行维护 重点关注web代码 通过两种方式进项扫描:1.字典枚举 2.递归爬网 优点:速度快.支持多路单 ...

  3. Kafka科普系列 | Kafka中的事务是什么样子的?

    事务,对于大家来说可能并不陌生,比如数据库事务.分布式事务,那么Kafka中的事务是什么样子的呢? 在说Kafka的事务之前,先要说一下Kafka中幂等的实现.幂等和事务是Kafka 0.11.0.0 ...

  4. 从Web抓取信息的几个常用方法

    1.Response 对象有一个 status_code 属性,可以检查它是否等于requests.codes.ok. 2.raise_for_status()方法是一种很好的方式,确保程序在下载失败 ...

  5. Python20-Day03

    ##########文件操作相关########## 一.文件操作 文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来. 文件操作的流程: * ...

  6. caffe 预训练 或者Fine-Tuning 操作

    1.使用预训练模型,需要修改训练的prototxt,将layer name改为与要使用模型的layer name相同即可. Borrowing Weights from a Pretrained Ne ...

  7. TeamWork#3,Week5,The First Meeting of Our Team

    sixsix第一次会议记录 [会议时间]2014年10月23日星期四19:00-20:00 [会议形式]小组讨论 [会议地点]5号公寓 [会议主持]高雅智 [会议记录]张志浩 会议整体流程 一.签到 ...

  8. Task 6.2冲刺会议六 /2015-5-19

    今天主要写的是登陆界面,用户状态,历史登录信息,默认用户等等.由于大部分时间都是把代码组合拳起来的过程,所以总会出现各种bug,有好大一部分不会修复.明天要继续这一部分还有熟悉一下聊天的主界面.

  9. 学习Web Service、wcf、webapi的区别

    csdn:关于wcf,webservice,webapi或者其他服务或者接口有什么区别. wcf,webservice采用的是rpc协议,这个协议很复杂,所以每次要传递.要校验的内容也很复杂,别看我们 ...

  10. mysql group by分组查询错误修改

    select @@global.sql_mode;set @@sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR ...