【BZOJ】1187: [HNOI2007]神奇游乐园
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1187
每个格子都具有权值,求任意一个回路使得路径上的权值和最大。
裸的插头DP,注意一下几点:
1.因为不一定要全部格子都要走过,所以可以空一格不走,前提这个状态是没有上插头和左插头的。
2.每个格子都应该可以作为起始状态(新建连通块)。
3.关于形成回路的状态显然不能再往下转移,同时如果这个的轮廓线上除了左插头和右插头之外没有插头了,可以算入答案。
QwQ...细节还是看代码吧。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 10010
#define llg long long
#define sizee 57
#define maxZT (1<<18)
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,now,size[],zt[][maxZT],ans,la,code[maxn],quan;
llg v[][maxZT]; struct node
{
llg x,val,pos;
}; vector<node>a[][sizee]; void outcode(llg x) {for (llg i=;i<=m;i++) code[i]=x&,x>>=;} void encode(llg p,llg val)
{
llg x=;
for (llg i=;i<=m;i++) x+=code[i]*(<<(i*));
llg wz=x%sizee,E=a[p][wz].size();
for (llg i=;i<E;i++)
if (a[p][wz][i].x==x)
{
a[p][wz][i].val=max(a[p][wz][i].val,val);
v[p][a[p][wz][i].pos]=max(v[p][a[p][wz][i].pos],val);
return ;
}
size[p]++;
node NEW; NEW.x=x; NEW.val=val; NEW.pos=size[p];
a[p][wz].push_back(NEW);
zt[p][size[p]]=x; v[p][size[p]]=val;
} void init_a(llg p){for (llg i=;i<sizee;i++) a[p][i].clear(); size[p]=;} void DP()
{
llg now=;
encode(,);
for (llg i=;i<=n;i++)
{
for (llg k=;k<=size[now];k++) zt[now][k]*=;
for (llg j=;j<=m;j++)
{
scanf("%lld",&quan);
now^=; la=now^; size[now]=;
init_a(now);
for (llg k=;k<=size[la];k++)
{
outcode(zt[la][k]);
llg le=code[j-],up=code[j],V=v[la][k]; if (!le && !up) //空格
{
encode(now,V);
}
//-------------------------------------------------------------------------------------
if (!le && !up)//没有插头,新建连通分量
{
if (j<m)
{
code[j-]=,code[j]=;
encode(now,V+quan);
}
continue;
}
//-------------------------------------------------------------------------------------
if (!le && up)//延续上插头
{
if (j<m) encode(now,V+quan);
code[j-]=code[j]; code[j]=;
encode(now,V+quan);
continue;
}
//-------------------------------------------------------------------------------------
if (le && !up)//延续左插头
{
encode(now,V+quan);
if (j<m)
{
code[j]=code[j-]; code[j-]=;
encode(now,V+quan);
}
continue;
}
//-------------------------------------------------------------------------------------
if (le== && up==)//回路闭合,统计答案
{
bool pd=true;
for (llg e=;e<j-;e++) if (code[e]) pd=false;
for (llg e=j+;e<=m;e++) if (code[e]) pd=false;
if (pd) ans=max(ans,V+quan);
// if (pd) cout<<i<<" "<<j<<"--->"<<V+quan<<endl;
continue;
}
//-------------------------------------------------------------------------------------
if (le== && up==)//左插头为右括号,上插头为左括号,直接合并
{
code[j]=code[j-]=;
encode(now,V+quan);
continue;
}
//-------------------------------------------------------------------------------------
if (le== && up==)//上左插头均为左括号,找到上插头所对应的右括号并将其修改为左括号
{
for (llg e=j+;e<=m;e++)
if (code[e]==)
{
code[e]=;
break;
}
code[j]=code[j-]=;
encode(now,V+quan);
continue;
}
//-------------------------------------------------------------------------------------
if (le== && up==)//上左插头均为右括号,找到左插头对应的左括号并将其修改为右括号
{
for (llg e=j-;e>=;e--)
if (code[e]==)
{
code[e]=;
break;
}
code[j]=code[j-]=;
encode(now,V+quan);
continue;
}
}
}
}
} int main()
{
yyj("a");
ans=-*0x7fffffff;
cin>>n>>m;
DP();
cout<<ans;
return ;
}
【BZOJ】1187: [HNOI2007]神奇游乐园的更多相关文章
- bzoj 1187: [HNOI2007]神奇游乐园 插头dp
1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 668 Solved: 337[Submit][Statu ...
- bzoj:1187: [HNOI2007]神奇游乐园
Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一个游乐场,专为旅途中疲惫的人设计. ...
- bzoj 1187: [HNOI2007]神奇游乐园【插头dp】
要判边界!!要判边界!!要判边界!!if(j!=m)!!! 我真是zz横着转移要判断到底能不能向右边出边-- 然后剩下的和1814差不多,九十因为不要求经过所有格子,所以左右括号随时可以合并,但是注意 ...
- 1187: [HNOI2007]神奇游乐园 - BZOJ
Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一个游乐场,专为旅途中疲惫的人设计. ...
- 【BZOJ1187】[HNOI2007]神奇游乐园 插头DP
[BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...
- 洛谷 P3190 [HNOI2007]神奇游乐园 解题报告
P3190 [HNOI2007]神奇游乐园 Description 给你一个 \(m * n\) 的矩阵,每个矩阵内有个权值\(V(i,j)\) (可能为负数),要求找一条回路,使得每个点最多经过一次 ...
- [bzoj1187][HNOI2007]神奇游乐园_插头dp
bzoj-1187 HNOI-2007 神奇游乐园 题目大意:经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这 ...
- 【bzoj1187】 HNOI2007—神奇游乐园
http://www.lydsy.com/JudgeOnline/problem.php?id=1187 (题目链接) 题意 一个$n*m$的矩阵,其中每一个位置有一个权值,求一条回路使得经过的位置的 ...
- BZOJ1187:[HNOI2007]神奇游乐园——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1187 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现 ...
随机推荐
- GoldenGate 12.3发布
新特性: oracle db1. 支持12.2 oracle db2. 支持微服务架构, 可以使用restful api 管理OGG3. Parallel replicat,性能比integrated ...
- Eloquent JavaScript #03# functions
索引: let VS. var 定义函数的几种方式 more... 1.作者反复用的side effect side effect就是对世界造成的改变,例如说打印某些东西到屏幕,或者以某种方式改变机器 ...
- MySQL字符类型datetime与timestamp
这片博客来详细分区一下这哥俩! 首先来说明这两个字符类型: DATETIME 8 1000-01-01 00:00:00 ~9999~12-31 23:59:59 0000-00-00 00:00:0 ...
- Docker学习笔记之保存和共享镜像
0x00 概述 让 Docker 引以为傲的是它能够实现相比于其他虚拟化软件更快的环境迁移和部署,在这件事情上,轻量级的容器和镜像结构的设计无疑发挥了巨大的作用.通过将容器打包成镜像,再利用体积远小于 ...
- CentOS 4.8/OEL4.8 配置本地yum
下载createrepo包并安装 下载地址: ftp://195.220.108.108/linux/dag/redhat/el4/en/i386/dag/RPMS/createrepo-0.4.6- ...
- Golang并发编程中select简单了解
select可以监听channel的数据流动select的用法与switch语法非常类似,由select开始的一个新的选择块,每个选择条件由case语句来描述 与switch语句可以选择任何使用相等比 ...
- Linux Redhat 安装免费yum源
Linux Redhat 安装免费yum源 出处地址:http://www.cnblogs.com/nbartchen/p/8565816.html 1.查看是否安装相关包 rpm -qa|grep ...
- JavaScript中冒泡与事件委托
冒泡 事件触发后事件流的三个阶段按顺序依次是: 1.捕获阶段 2.目标阶段 3.冒泡阶段 大盒子包裹小盒子,两个盒子都分别添加点击事件,当点击小盒子,两个盒子的事件都会触发. 事件委托 下级元素委托上 ...
- Python 用pygame模块播放MP3
安装pygame(这个是python3,32位的) pip安装这个whl文件 装完就直接跑代码啦,很短的 import time import pygame file=r'C:\Users\chan\ ...
- js导读,js引入,js选择器,事件,操作页面文档,计算后样式,数据类型
js导读 ''' js属于编写运行在浏览器上的脚本语言 js采用ECMAScript语法 操作BOM:浏览器对象模型 eg:浏览器上下滑动,浏览器历史记录 操作DOM:文档对象模型 ''' js引入 ...