洛谷 P3190 [HNOI2007]神奇游乐园 解题报告
P3190 [HNOI2007]神奇游乐园
Description
给你一个 \(m * n\) 的矩阵,每个矩阵内有个权值\(V(i,j)\) (可能为负数),要求找一条回路,使得每个点最多经过一次,并且经过的点权值之和最大。
Input
输入文件中的第一行为两个正整数\(n\)和\(m\),表示游乐场的大小为\(n*m\)。因为这个娱乐场很狭窄,所以\(n\)和\(m\)满足:\(2\le n\le 100\),\(2\le m\le 6\)。接下来的\(n\)行,每行有\(m\)个整数,第\(i\)行第\(j\)列表示游乐场的第\(i\)行第\(j\)列的小格子中的娱乐项目的满意度,这个满意度的范围是\([-1000,1000]\)。同一行的两个整数之间用空格隔开。
Output
输出文件中仅一行为一个整数,表示最高的满意度之和。
注意几个问题
什么时候更新答案?
当前格子左边是\(1\),上边是\(2\)且除去这个\(1\)和\(2\)后的状态上没有插头。
每次新一行的时候我们会把状态数组向右移动两位,这时候会当\(n\)比较大的时候出现负数,在插入\(Hash\)表取模后需要把\(Ta\)变成正数。
当然也可以有其他的方法,用无符号整型自然溢出或者手动每次\(\&\)一个状态内全是\(1\),其余的位置全是\(0\)的数字。实测每次\(\&\)的速度是最快的,大概是其他两个的\(1/8\)。
- 其实写的漂亮并不会出现负数
- 但是一出现可能挂的很惨哦
在伸出插头时一定要注意边界,不能越过\(n\)和\(m\)
Code:
#include <cstdio>
#include <cstring>
const int N=3e5;
const int mod=299987;
int n,m,cur,bit[12],ans=-0x3f3f3f3f,a[110][10];
int head[N],to[N],Next[N],cnt[2],tot,dp[2][N],sta[2][N],del;
void Ins(int s,int val)
{
s=s&del;
int x=s%mod;
for(int i=head[x];i;i=Next[i])
if(sta[cur][to[i]]==s)
{
dp[cur][to[i]]=dp[cur][to[i]]>val?dp[cur][to[i]]:val;
return;
}
sta[cur][++cnt[cur]]=s;
dp[cur][cnt[cur]]=val;
to[++tot]=cnt[cur];
Next[tot]=head[x];
head[x]=tot;
}
void DP()
{
dp[cur][++cnt[cur]]=0,sta[cur][cnt[cur]]=0;
for(int i=1;i<=n;i++)
{
for(int s=1;s<=cnt[cur];s++) sta[cur][s]=(sta[cur][s]<<2)&(del);
for(int j=1;j<=m;j++)
{
cur^=1;
tot=cnt[cur]=0;
memset(head,0,sizeof(head));
for(int s=1;s<=cnt[cur^1];s++)
{
int lassta=sta[cur^1][s],lasans=dp[cur^1][s];
int sr=lassta>>bit[j-1]&3,sd=lassta>>bit[j]&3;
if(!sr&&!sd)
{
Ins(lassta,lasans);//没选
Ins(lassta|(1<<bit[j-1])|(2<<bit[j]),lasans+a[i][j]);//选
}
else if(!sr&&sd)
{
if(j<m) Ins(lassta,lasans+a[i][j]);
if(i<n) Ins((lassta|(sd<<bit[j-1]))&(~(sd<<bit[j])),lasans+a[i][j]);
}
else if(sr&&!sd)
{
if(i<n) Ins(lassta,lasans+a[i][j]);
if(j<m) Ins((lassta|(sr<<bit[j]))&(~(sr<<bit[j-1])),lasans+a[i][j]);
}
else if(sr==1&&sd==1)
{
int ct=1;
for(int k=j+2;k<=m;k++)
{
if((lassta>>bit[k-1]&3)==1) ++ct;
if((lassta>>bit[k-1]&3)==2) --ct;
if(!ct)
{
Ins((lassta&(~(sr<<bit[j-1])&(~(sd<<bit[j]))))-(1<<bit[k-1]),lasans+a[i][j]);
break;
}
}
}
else if(sr==2&&sd==2)
{
int ct=1;
for(int k=j-1;k;k--)
{
if((lassta>>bit[k-1]&3)==2) ++ct;
if((lassta>>bit[k-1]&3)==1) --ct;
if(!ct)
{
Ins((lassta&(~(sr<<bit[j-1])&(~(sd<<bit[j]))))+(1<<bit[k-1]),lasans+a[i][j]);
break;
}
}
}
else if(sr==2&&sd==1)
Ins(lassta&(~(sr<<bit[j-1])&(~(sd<<bit[j]))),lasans+a[i][j]);
else if(sr==1&&sd==2&&!(lassta&(~(sr<<bit[j-1]))&(~(sd<<bit[j]))&del))
ans=ans>lasans+a[i][j]?ans:lasans+a[i][j];
}
}
}
}
int main()
{
for(int i=1;i<=10;i++) bit[i]=i<<1;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
del=(1<<(m+1<<1|1))-1;
DP();
printf("%d\n",ans);
return 0;
}
2018.12.20
洛谷 P3190 [HNOI2007]神奇游乐园 解题报告的更多相关文章
- 洛谷P3190 [HNOI2007]神奇游乐园(插头dp)
传送门 大概是算第一道自己做出来的插头dp? (虽然都是照着抄板子的) (虽然有个地方死活没调出来最后只能看题解才发现自己错在哪里的) 我就当你们都会插头dp了…… 因为必须得是一条路径,所以扫描线上 ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P1462 通往奥格瑞玛的道路 解题报告
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告
P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...
- 洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告
P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...
随机推荐
- 高可用Kubernetes集群-16. ansible快速部署
说明 本文档指导采用二进制包的方式快速部署高可用kubernetes集群. 脚本托管:k8s-ansible(持续更新) 参考:高可用kubernetes集群 组件版本 组件 版本 备注 centos ...
- kafka handler
1.配置kafka 参数文件 在ogg主目录下有示例文件: [root@WH0PRDBRP00AP0013 ogg]# cd AdapterExamples/big-data/kafka/ [root ...
- 20172319 《Java程序设计教程》 第9周学习总结
20172319 2018.05.06-05.14 <Java程序设计教程>第9周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...
- 场景调研 persona
1.姓名:王涛 2.年龄:22 3.收入:基本无收入 4.代表用户在市场上的比例和重要性:王涛为铁道学生.本软件的用户主要是学生和老师,尤其是广大的铁大学子,所以此典型用户的重要性不言而喻,而且比例相 ...
- beat冲刺(7/7)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(7/7) 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 还剩下哪些 ...
- 剑指offer:二位数组中的查找
准备找实习期间,复习一下数据相关内容,刷刷题. 题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样 ...
- 啊啊啊 草蛋啊 之前努力一天搞出来的时间算法 被一句pk掉 给我砖头
package yun3; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Cale ...
- Beta 冲刺 (6/7)
队名:Boy Next Door 燃尽图 代码写入 https://github.com/mangoqiqi/paybook/tree/master/Desktop/Web%E8%B4%A6%E5%8 ...
- 学习率(Learning rate)的理解以及如何调整学习率
1. 什么是学习率(Learning rate)? 学习率(Learning rate)作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值.合适的学习率 ...
- bootstrap使用总结
bootstrap是一个webcss框架,集合了html/css/jquery为一家,创建响应式的页面.所谓的响应式就是适配不同的上网设备. 使用bootstrap的步骤: 1.下载bootstrap ...