【bzoj1187】 HNOI2007—神奇游乐园
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—神奇游乐园的更多相关文章
- [bzoj1187][HNOI2007]神奇游乐园_插头dp
bzoj-1187 HNOI-2007 神奇游乐园 题目大意:经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这 ...
- [bzoj1187][HNOI2007]神奇游乐园
来自FallDream的博客,未经允许,请勿转载,谢谢, 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一 ...
- BZOJ1187 [HNOI2007]神奇游乐园(插头dp)
麻麻我会写插头dp了! 推荐陈丹琦论文:https://wenku.baidu.com/view/3e90d32b453610661ed9f4bd.html 破题调一年 #include <cs ...
- 【BZOJ1187】[HNOI2007]神奇游乐园 插头DP
[BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...
- bzoj 1187: [HNOI2007]神奇游乐园 插头dp
1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 668 Solved: 337[Submit][Statu ...
- 洛谷 P3190 [HNOI2007]神奇游乐园 解题报告
P3190 [HNOI2007]神奇游乐园 Description 给你一个 \(m * n\) 的矩阵,每个矩阵内有个权值\(V(i,j)\) (可能为负数),要求找一条回路,使得每个点最多经过一次 ...
- BZOJ1187:[HNOI2007]神奇游乐园——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1187 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现 ...
- 1187: [HNOI2007]神奇游乐园 - BZOJ
Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一个游乐场,专为旅途中疲惫的人设计. ...
- bzoj:1187: [HNOI2007]神奇游乐园
Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一个游乐场,专为旅途中疲惫的人设计. ...
随机推荐
- 经典的性能优化最佳实践 web性能权威指南 读书笔记
web性能权威指南 page 203 经典的性能优化最佳实践 无论什么网络,也不管所用网络协议是什么版本,所有应用都应该致力于消除或减 少不必要的网络延迟,将需要传输的数据压缩至最少.这两条标准是经典 ...
- cmd下执行mysql
1. mysql -uroot -p1234; 2. show databases; 3. use testnode; 4. 创建数据库表 CREATE DATABASE `node` DEFA ...
- 服务端模版注入漏洞检测payload整理
服务端模版注入漏洞产生的根源是将用户输入的数据被模版引擎解析渲染可能导致代码执行漏洞 下表涵盖了java,php,python,javascript语言中可能使用到的模版引擎,如果网站存在服务端模版注 ...
- PHP.ini 能不能加载子配置文件 ?
答案是不能,php这个地方用的是另一个方案解决的 编译的时候 用这个参数 --with-config-file-scan-dir指定一个目录 然后在这个目录里面加载ini https://www. ...
- Win7-64位PowerDesigner下MySQLODBC驱动问题
操作系统:win7-64位,PowerDesigner15.1(以下简称PD), MYSQL-ODBC-64驱动.安装完MYSQL-ODBC-64却找不到相关驱动,用PD反导数据库,却找不到Mysql ...
- 关于手机端h5上传图片配合exif.min.js,processImg.js的使用
首先这里有个new FileReader()的概念,这是h5新增的,用来把文件读入内存,并且读取文件中的数据.FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件 ...
- T&F 圆桌:儿童智能玩具离我们还有多远?
“女人和孩子的钱是最好挣的”,这句经典的名句被很多商家奉为信条,这在现实生活中也得到了很好的印证. 各种步行街.商业街.Mall 干的做多的事情就是:围绕着女人和孩子打造创造消费点.步行街.商业街上各 ...
- Promise.all请求失败重发功能的实现
写爬虫时遇到用Promise.all同时请求多个页面,不可避免的会遇到某些请求失败的情况,这时可以实现一个"重发失败请求"的功能. Promise.all(task).then() ...
- OO学习总结与体会
前言 经过了对于面向对象程序设计的一个月的学习,我初尝了JAVA以及面向对象程序的魅力.经历了三次难度逐渐加大的课后编程作业,我对于工程化面向对象编程以及调试有了深刻的认识与颇多感想.我写下本篇文章以 ...
- C++:友元
前言:友元对于我来说一直是一个难点,最近看了一些有关友元的课程与博客,故在此将自己的学习收获做一个简单的总结 一.什么是友元 在C++的自定义类中,一个常规的成员函数声明往往意味着: • 该成员函数能 ...