题目链接: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]神奇游乐园的更多相关文章

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

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

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

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

  3. bzoj 1187: [HNOI2007]神奇游乐园【插头dp】

    要判边界!!要判边界!!要判边界!!if(j!=m)!!! 我真是zz横着转移要判断到底能不能向右边出边-- 然后剩下的和1814差不多,九十因为不要求经过所有格子,所以左右括号随时可以合并,但是注意 ...

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

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

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

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

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

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

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

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

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

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

  9. BZOJ1187:[HNOI2007]神奇游乐园——题解

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

随机推荐

  1. storm的trident编程模型

    storm的基本概念别人总结的, https://blog.csdn.net/pickinfo/article/details/50488226 编程模型最关键最难就是实现局部聚合的业务逻辑聚合类实现 ...

  2. flask框架----flask入门

    一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  3. 前端框架VUE----计算属性和侦听器

    一.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split('').rev ...

  4. 开启redis-server提示 # Creating Server TCP listening socket *:6379: bind: Address already in use--解决方法

    在bin目录中开启Redis服务器,完整提示如下: 3496:C 25 Apr 00:56:48.717 # Warning: no config file specified, using the  ...

  5. selenium webdriver 实现Canvas画布自动化测试

    https://blog.csdn.net/xiaoguanyusb/article/details/80324210 由借鉴意义, 转过来 canvas 是一个画布,定位元素时只能定位到画布上,如下 ...

  6. ManyToManyField 增加记录

    class BOMView(View): def get(self,request): obj=BOMForm() return render(request,'bom.html',{'obj':ob ...

  7. 02: docker高级篇

    1.1 Docker Compose 1.Docker Compose 介绍 1. Compose是一个定义和管理多容器的工具,使用Python语言编写. 2. 使用Compose配置文件描述多个容器 ...

  8. intel webrtc 部署

    org link conference server Configure the MCU server 1. set the maximum numbers of open files, runnin ...

  9. 程序重启RocketMQ消息重复消费

    最近在调试RocketMQ消息发送与消费的Demo时,发现一个问题:只要重启程序,RocketMQ消息就会重复消费. 那么这是什么原因导致的,又该如何解决呢? 经过一番排查,发现程序使用的Rocket ...

  10. 【ContextLoaderListener】Web项目启动报错java.lang.ClassNotFoundException: ContextLoaderListener

    错误原因: 进入到tomcat的部署路径.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\下检查了一下,发现工程部署后在WE ...