P3190-[HNOI2007]神奇游乐园【插头dp】
正题
题目链接:https://www.luogu.com.cn/problem/P3190
题目大意
\(n*m\)的网格上有权值,求一条权值和最大的不交回路。
\(1\leq n\leq 100,1\leq m\leq 6\)
解题思路
经典的棋盘形插头\(dp\),和模板不同的地方是求最大权值和并且不用铺满整张图。
那么在没有插头的地方可以选择不新建插头就好了,需要注意判断边界\(j=m\)和\(i=n\)的情况。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int P=333331;
struct node{
int to,next;
}a[P<<1];
int n,m,v[110][10],bit[10];
int t[2],S[2][P],dp[2][P];
int ans,tot,o,ls[P];
void Add(int s,int v){
int x=s%P;
for(int i=ls[x];i;i=a[i].next)
if(S[o][a[i].to]==s)
{dp[o][a[i].to]=max(dp[o][a[i].to],v);return;}
t[o]++;S[o][t[o]]=s;dp[o][t[o]]=v;
a[++tot].to=t[o];a[tot].next=ls[x];ls[x]=tot;
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&v[i][j]);
for(int i=0;i<=m;i++)bit[i]=(1<<(i<<1));
t[o]=1;ans=-2147483647;
for(int i=1;i<=n;i++){
for(int j=1;j<=t[o];j++)S[o][j]<<=2;
for(int j=1;j<=m;j++){
o=!o;t[o]=tot=0;
memset(ls,0,sizeof(ls));
int s,w,dpl,rpl;
for(int k=1;k<=t[!o];k++){
s=S[!o][k];w=dp[!o][k];
dpl=(s>>(j<<1))%4;
rpl=(s>>(j-1<<1))%4;
if(!dpl&&!rpl){
Add(s,w);
if(i!=n&&j!=m)Add(s+bit[j-1]+2*bit[j],w+v[i][j]);
}
else if(!dpl&&rpl){
if(i!=n)Add(s,w+v[i][j]);
if(j!=m)Add(s-rpl*bit[j-1]+rpl*bit[j],w+v[i][j]);
}
else if(dpl&&!rpl){
if(i!=n)Add(s-dpl*bit[j]+dpl*bit[j-1],w+v[i][j]);
if(j!=m)Add(s,w+v[i][j]);
}
else if(dpl==1&&rpl==1){
int c=1;
for(int p=j+1;p<=m;p++){
if((s>>(p<<1))%4==1)c++;
if((s>>(p<<1))%4==2)c--;
if(!c){Add(s-bit[j]-bit[j-1]-bit[p],w+v[i][j]);break;}
}
}
else if(dpl==2&&rpl==2){
int c=1;
for(int p=j-2;p>=0;p--){
if((s>>(p<<1))%4==2)c++;
if((s>>(p<<1))%4==1)c--;
if(!c){Add(s-2*bit[j]-2*bit[j-1]+bit[p],w+v[i][j]);break;}
}
}
else if(dpl==1&&rpl==2)
Add(s-bit[j]-2*bit[j-1],w+v[i][j]);
else if(dpl==2&&rpl==1){
if(dpl*bit[j]+rpl*bit[j-1]==s)
ans=max(ans,w+v[i][j]);
}
}
}
}
printf("%d\n",ans);
return 0;
}
P3190-[HNOI2007]神奇游乐园【插头dp】的更多相关文章
- bzoj 1187: [HNOI2007]神奇游乐园 插头dp
1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 668 Solved: 337[Submit][Statu ...
- 【BZOJ1187】[HNOI2007]神奇游乐园 插头DP
[BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...
- 洛谷 P3190 [HNOI2007]神奇游乐园 解题报告
P3190 [HNOI2007]神奇游乐园 Description 给你一个 \(m * n\) 的矩阵,每个矩阵内有个权值\(V(i,j)\) (可能为负数),要求找一条回路,使得每个点最多经过一次 ...
- 洛谷P3190 [HNOI2007]神奇游乐园(插头dp)
传送门 大概是算第一道自己做出来的插头dp? (虽然都是照着抄板子的) (虽然有个地方死活没调出来最后只能看题解才发现自己错在哪里的) 我就当你们都会插头dp了…… 因为必须得是一条路径,所以扫描线上 ...
- [HNOI2007][bzoj1187] 神奇游乐园 [插头dp]
题面: 传送门 给定一个四联通棋盘图,每个格子有权值,求一条总权值最大的回路 思路: 插头dp基础教程 棋盘? 回路? n,m<=10? 当然是插头dp啦~\(≧▽≦)/~ 然后发现这道题并不是 ...
- P3190 [HNOI2007]神奇游乐园
传送门 第一道插头 $dp$ 由于讲不清楚所以假装各位早就会插头 $dp$ 了 首先要的是一个闭合回路,所以可以用括号表示法表示状态,然后大力分类讨论 $1.$ 没有右插头和下插头 那么我们可以啥也不 ...
- [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 ...
- 1187: [HNOI2007]神奇游乐园 - BZOJ
Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一个游乐场,专为旅途中疲惫的人设计. ...
随机推荐
- Centos7上yum安装redis
下载tar包 wget http://download.redis.io/releases/redis-6.0.5.tar.gz 解压tar包 tar -zxvf redis-6.0.5.tar.gz ...
- 8、二进制安装K8s之部署CIN网络
二进制安装K8s之部署CIN网络 部署CIN网络可以使用flannel或者calico,这里介绍使用calico ecd 方式部署. 1.下载calico二进制安装包 创建所需目录 mkdir -p ...
- .NET Core:在ASP.NET Core WebApi中使用Cookie
一.Cookie的作用 Cookie通常用来存储有关用户信息的一条数据,可以用来标识登录用户,Cookie存储在客户端的浏览器上.在大多数浏览器中,每个Cookie都存储为一个小文件.Cookie表示 ...
- uwp 之吐司 toast
Toast -------------------------------------------------------------- var t = Windows.UI.Notification ...
- JS对象创建的几种方法
最近一直在看JS高级程序设计这本书,有空来梳理一下几种创建对象的方式.话不多说,直接步入正题. 第一种:Object构造函数创建 var Person = new Object(); Person.n ...
- 关于struts中Ognl和iterator配合再次理解
Person.jsp (struts.xml中省略) package com.mzy.entity; public class Person { private String name; privat ...
- 刷题-力扣-1011. 在 D 天内送达包裹的能力
1011. 在 D 天内送达包裹的能力 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/capacity-to-ship-packag ...
- 并发编程之:Lock
大家好,我是小黑,一个在互联网苟且偷生的农民工. 在之前的文章中,为了保证在并发情况下多线程共享数据的线程安全,我们会使用synchronized关键字来修饰方法或者代码块,以及在生产者消费者模式中同 ...
- MySQL——备份与恢复
MySQL数据库备份和恢复 --备份类型: 1.热备份(只有InnoDB支持)(不影响业务,最好的方式) 2.冷备份( 阻止用户访问) 3.温备份 --备份方式: 1.逻辑备份(文本表示:SQL语句) ...
- Python - 面向对象编程 - 魔术方法(双下划线方法)
什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...