【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发现 ...
随机推荐
- 听 Fabien Potencier 谈Symfony2 之 《What is Symfony2 ?》
Symfoy2 是什么? PHP世界里又一广受关注的web MVC框架? Fabien Potencier 却不这么说! Fabien Potencier这样定义Symfoy2 是个什么东西: 首先, ...
- kubernetes install for centos
官方的文档写的很清楚 https://kubernetes.io/docs/getting-started-guides/centos/centos_manual_config/ 如果已经安装过doc ...
- Web开发相关笔记 #05# MySQL中文无法匹配
2018-06-02 在 Class.forName 的时候记得先尝试 import 一下. 2018-06-04 1.JDBC SELECT 查询,中文条件查不出东西,可能是字符编码问题: Stri ...
- BIOS备忘录之通过Windbg来追踪ASL code的运行
通过Windbg来追踪ASL code的运行: 目标机的配置: 第一步: 在BIOS Setup下面 disable secure boot(不然下面debug on 命令会失败):关闭防火墙. 第二 ...
- Prometheus监控学习笔记之Prometheus监控简介
0x00 Prometheus容器监控解决方案 Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的.它是一个独立的开放源码项目,并且独立于任何公司.不同 ...
- golang fatal error: all goroutines are asleep - deadlock!
转自:https://www.cnblogs.com/ghj1976/p/4295013.html http://blog.csdn.net/skh2015java/article/details/6 ...
- go实例—函数或方法的可变长参数
支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数. 需要注意的是,可变长参数应该是函数定义的最右边的参数,即最后一个参数 package ...
- nmap扫描内网存活机器脚本
nmap扫描内网存活机器并保存在指定文件中. host.sh #/usr/bin/bash read -p "Please input scan host or network:" ...
- 转:网卡、光纤网卡、ISCSI卡有什么区别?
网卡.光纤网卡.ISCSI卡有什么区别? 感谢: http://www.it.com.cn/f/server/063/6/241650.htm 在讨论这个问题的时候,需要先说清楚一个问题:我们知道,在 ...
- promql查询表达式
Basics 即时矢量选择器 =:匹配与标签相等的内容!=:不匹配与标签相等的内容=~: 根据正则表达式匹配与标签符合的内容!~:根据正则表达式不匹配与标签符合的内容 示例: http_request ...