[HNOI2007][bzoj1187] 神奇游乐园 [插头dp]
题面:
给定一个四联通棋盘图,每个格子有权值,求一条总权值最大的回路
思路:
棋盘?
回路?
n,m<=10?
当然是插头dp啦~\(≧▽≦)/~
然后发现这道题并不是哈密顿回路了......需要考虑一下终止条件的不同,对比URAL1519
诚然,回路问题中依然可以用括号表示法来压缩状态,但是此时形成回路、统计答案的就不仅仅在最后一个非障碍格子才可以,而是任何时候,只要状态中只剩下一对左右插头满足条件(看不懂这里的可以去上面那道题看看)
同时请注意,这道题统计的是最值、不是和值
同时请注意,这题可能会爆longlong......我丧病地开了__int128,避免了高精度的地狱
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define hash deep_dark_fantasy
#define inf 1e9
using namespace std;
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
int n,m,x[][],cur,pre,ex,ey;
int st[][];ll ans[][],re;
int tot[],bit[],state[],st_tot,hash=;
struct edge{
int to,next;
}a[];
void insert(int sta,ll val){
int p=sta%hash,i;
for(i=state[p];i;i=a[i].next){
if(st[cur][a[i].to]==sta){
ans[cur][a[i].to]=max(ans[cur][a[i].to],val);return;
}
}
tot[cur]++;
a[++st_tot].to=tot[cur];
a[st_tot].next=state[p];
state[p]=st_tot;st[cur][tot[cur]]=sta;ans[cur][tot[cur]]=val;
}
void dp(){
int i,j,k,l,now,down,right;ll val;re=-inf;
cur=;tot[cur]=;ans[cur][]=;st[cur][]=;
for(i=;i<=n;i++){
for(j=;j<=tot[cur];j++) st[cur][j]<<=;
for(j=;j<=m;j++){
pre=cur;cur^=;tot[cur]=;st_tot=;memset(state,,sizeof(state));
for(k=;k<=tot[pre];k++){
now=st[pre][k];val=ans[pre][k];
right=(now>>bit[j-])%;down=(now>>bit[j])%;
if(!down&&!right){
insert(now,val);
if(j!=m)
insert(now+(<<bit[j-])+((<<bit[j])<<),val+x[i][j]);
}
if(down&&!right){
insert(now-down*(<<bit[j])+down*(<<bit[j-]),val+x[i][j]);
if(j!=m)insert(now,val+x[i][j]);
}
if(right&&!down){
insert(now,val+x[i][j]);
if(j!=m)
insert(now+right*(<<bit[j])-right*(<<bit[j-]),val+x[i][j]);
}
if(right==&&down==){
int cnt=;
for(l=j+;l<=m;l++){
if((now>>bit[l])%==) cnt++;
if((now>>bit[l])%==) cnt--;
if(!cnt){
insert(now-(<<bit[l])-(<<bit[j])-(<<bit[j-]),val+x[i][j]);
break;
}
}
}
if(right==&&down==){
int cnt=;
for(l=j-;l>=;l--){
if((now>>bit[l])%==) cnt--;
if((now>>bit[l])%==) cnt++;
if(!cnt){
insert(now+(<<bit[l])-((<<bit[j])<<)-((<<bit[j-])<<),val+x[i][j]);
break;
}
}
}
if(right==&&down==){
insert(now-((<<bit[j-])<<)-(<<bit[j]),val+x[i][j]);
}
if(right==&&down==){
if((now==(<<bit[j-])+((<<bit[j])<<))&&(val+x[i][j]>re)){
re=val+x[i][j];
}
}
}
}
}
}
int main(){
int i,j;
n=read();m=read();
for(i=;i<=;i++) bit[i]=(i<<);
for(i=;i<=n;i++) for(j=;j<=m;j++) x[i][j]=read();
dp();
printf("%lld",re);
}
[HNOI2007][bzoj1187] 神奇游乐园 [插头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]神奇游乐园(插头DP)
Description 题意给定一个矩阵,每个格子有权值,在[-1000.1000]内,求一条回路使得回路经过权值和最大,每个格子最多经过一次 2≤n≤100,2≤m≤6 Code #include ...
- [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 ...
- 洛谷P3190 [HNOI2007]神奇游乐园(插头dp)
传送门 大概是算第一道自己做出来的插头dp? (虽然都是照着抄板子的) (虽然有个地方死活没调出来最后只能看题解才发现自己错在哪里的) 我就当你们都会插头dp了…… 因为必须得是一条路径,所以扫描线上 ...
- [bzoj1187][HNOI2007]神奇游乐园
来自FallDream的博客,未经允许,请勿转载,谢谢, 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一 ...
- 【bzoj1187】 HNOI2007—神奇游乐园
http://www.lydsy.com/JudgeOnline/problem.php?id=1187 (题目链接) 题意 一个$n*m$的矩阵,其中每一个位置有一个权值,求一条回路使得经过的位置的 ...
随机推荐
- 机器学习中正则化项L1和L2的直观理解
正则化(Regularization) 概念 L0正则化的值是模型参数中非零参数的个数. L1正则化表示各个参数绝对值之和. L2正则化标识各个参数的平方的和的开方值. L0正则化 稀疏的参数可以防止 ...
- 解决ndk编译lua时遇到 undefined reference to '__srget'的问题
今天用ndk r10d版本编译lua时,遇到几个错误,提示没有找到__srget 没有定义,于是看了国外的大神的解决方法, 是因为ndk在r10c之后的版本已经将getc函数屏蔽了,所以导致编译器找不 ...
- 1046: [HAOI2007]上升序列
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5822 Solved: 2071[Submit][Status][Discuss] Descript ...
- 2018.10.30 NOIp模拟赛T2 数字对
[题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题. 她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...
- Log错误日志级别
日志记录器(Logger)的级别顺序: 分为OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL或者您定义的级别.Log4j建议只使用四个级别,优先级 从高到低分别是 ERR ...
- django-redis缓存记录
对于站点缓存,我们使用redis这款key-value数据库.Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径.Redis的数据类型都是基于基本数据结构的 ...
- spring boot 集成swagger2
1 在pom.xml中加入Swagger2的依赖 <dependency> <groupId>io.springfox</groupId> <artifac ...
- linux正则表达式扩展部分
扩展的正则表达式(Extended Regular Expressions): 使用的命令为:grep -E以及egrep [了解即可] 1)+ 表示重复“一个或一个以上”前面的字符(*是0或多 ...
- win7在某个盘或文件夹中出现右键只能新建文件夹的情况 (2012-12-28-bd 写的日志迁移
至于只能新建文件夹的情况如图: 解决方法是在运行中输入msconfig进入如图: 在系统设置选工具项在选中更改UAC设置点击启动如图: 如图: 直接把通知栏拉到最低确定即可(如果已经是最低了那就随便改 ...
- 阿里云服务器+Tomcat项目+mysql 发布项目全过程
这个博客管理系统折腾我好几天了. 总结一下整个过程吧! 1.首先这个博客在tomcat下 windows系统可以完全跑起来了,无论是前台或者后台都能实现所有的功能. 2.然后我买了一个域名jasonj ...