[BZOJ1187]神奇游乐园(插头DP)
Description
题意给定一个矩阵,每个格子有权值,在[-1000.1000]内,求一条回路使得回路经过权值和最大,每个格子最多经过一次
2≤n≤100,2≤m≤6
Code
#include <cstdio>
#include <algorithm>
#define N 10
#define Inf 0x7fffffff
using namespace std;
int A[N],now,op[N],k[N],L[N],Ans=-Inf;
int n,m,g[110][N],dp[2][20000],q[2][20000],t[2];
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void push(int x,int y){
if(dp[now^1][x]==-Inf) q[now^1][++t[now^1]]=x;
dp[now^1][x]=max(dp[now^1][x],y);
}
void clear(){
for(int i=1;i<=t[now];++i) dp[now][q[now][i]]=-Inf;
t[now]=0;
now^=1;
}
void f(int S){
int tp=0;
for(int i=0;i<=m;++i){
k[i]=S&3,S>>=2;//
if(k[i]==1) L[++tp]=i;
else if(k[i]==2) op[op[i]=L[tp--]]=i;
}
}
void bfs(int x,int y){
clear();
for(int i=1;i<=t[now];++i){
int S=q[now][i];
f(S);
int l=k[y-1],r=k[y],upd=dp[now][S]+g[x][y];
if(!l&&!r){
push(S,upd-g[x][y]);
push(S+A[y-1]+(A[y]<<1),upd);
}else if(l&&r){
int tS=S-l*A[y-1]-r*A[y];
if(l==2&&r==1) push(tS,upd);
else if(l==1&&r==1) push(tS-A[op[y]],upd);
else if(l==2&&r==2) push(tS+A[op[y-1]],upd);
else if(!tS) Ans=max(Ans,upd);
}
else{
push(S,upd);
push(S-l*A[y-1]-r*A[y]+l*A[y]+r*A[y-1],upd);
}
}
}
int main(){
A[0]=1;for(int i=1;i<N;++i)A[i]=A[i-1]<<2;//四进制
for(int i=0;i<2;++i)for(int j=0;j<20000;++j)dp[i][j]=-Inf;
n=read(),m=read();
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)g[i][j]=read();
push(0,0);
for(int i=1;i<=n;++i){
clear();
for(int j=1;j<=t[now];++j) if(q[now][j]<A[m]) push(q[now][j]<<2,dp[now][q[now][j]]);
for(int j=1;j<=m;++j) bfs(i,j);
}
printf("%d\n",Ans);
return 0;
}
[BZOJ1187]神奇游乐园(插头DP)的更多相关文章
- [HNOI2007][bzoj1187] 神奇游乐园 [插头dp]
题面: 传送门 给定一个四联通棋盘图,每个格子有权值,求一条总权值最大的回路 思路: 插头dp基础教程 棋盘? 回路? n,m<=10? 当然是插头dp啦~\(≧▽≦)/~ 然后发现这道题并不是 ...
- 【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 ...
- [bzoj1187][HNOI2007]神奇游乐园_插头dp
bzoj-1187 HNOI-2007 神奇游乐园 题目大意:经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这 ...
- BZOJ1187 [HNOI2007]神奇游乐园(插头dp)
麻麻我会写插头dp了! 推荐陈丹琦论文:https://wenku.baidu.com/view/3e90d32b453610661ed9f4bd.html 破题调一年 #include <cs ...
- [HNOI2007]神奇游乐园(插头DP)
题意:n*m的矩阵内值有正有负,找一个四连通的简单环(长度>=4),使得环上值的和最大. 题解:看到2<=m<=6和简单环,很容易想到插头DP,设f[i][j][k]表示轮廓线为第i ...
- 【插头DP】BZOJ1187- [HNOI2007]神奇游乐园
[题目大意] 在n*m的网格中选一条回路,使权值和最大. [思路] 和之前裸的插头DP差不多,只不过现在回路不需要经过所有的格子.所以有以下几个注意点(具体看注释): (1)left和up插头相等的时 ...
- 洛谷P3190 [HNOI2007]神奇游乐园(插头dp)
传送门 大概是算第一道自己做出来的插头dp? (虽然都是照着抄板子的) (虽然有个地方死活没调出来最后只能看题解才发现自己错在哪里的) 我就当你们都会插头dp了…… 因为必须得是一条路径,所以扫描线上 ...
- P3190-[HNOI2007]神奇游乐园【插头dp】
正题 题目链接:https://www.luogu.com.cn/problem/P3190 题目大意 \(n*m\)的网格上有权值,求一条权值和最大的不交回路. \(1\leq n\leq 100, ...
随机推荐
- easyUI 鼠标悬停某行提示
最近参与公司的电子档案系统的开发,需求是需要用户鼠标悬停某一行时,需要根据后台业务数据进行提示. 档案系统开发采用的框架是struts2+mybatis+spring+easyUI开发,而前端的e ...
- Xpath定位绝密版本
xpath的作用就是两个字“定位”, 运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker 在 XPath 中, 有七种类型的节点:元素. ...
- 添加egit插件
1.下载egit插件 打开Eclipse,git需要eclipse授权,通过网页是无法下载egit的安装包的.在菜单栏依次打开eclipse→help→install new software→add ...
- 从零开始的全栈工程师——js篇2.13(案例存放:三重数组渲染)
- 链接文字<a>保持原有的字体颜色
<style type="text/css"> #red {color: red;} #blue {color: blue;} #orange {color: oran ...
- iQuery stop()
jQuery stop() 方法 jQuery stop() 方法用于停止动画或效果,在它们完成之前. stop() 方法适用于所有 jQuery 效果函数,包括滑动.淡入淡出和自定义动画. 语法 $ ...
- keil 系列问题
1.为了让keil支持stm32f0系列,安装了keil4更高级的版本,但是发现编译时弹出异常提示框,经过一番折腾后找到解决办法,首先把电脑登陆账户名改为非中文的,然后卸载了keil重装就可以了. ...
- javaweb 工程 tomcat启动报错的问你
2015-03-03 14:39:32,657 INFO (org.springframework.web.context.ContextLoader:296) - Root WebApplicati ...
- amap -bq 192.168.5.9 80 3306
amap -bq 192.168.5.9 80 3306 查看运行在指定端口上运行的服务
- oracle数据类型及操作
1. Oracle字符串操作 1.1 字符串类型 Ø CHAR和VARCHAR2类型 l CHAR存放定长字符,如果数据存不满指定长度则用空格补齐,CHAR类型浪费空间换取查询时间的缩短. l VAR ...