BZOJ2310 : ParkII
单路径最大和问题,设f[i][j][S]表示到达(i,j),轮廓线状态为S的最优解。
S用4进制m+1位数表示,0表示无插头,1表示左括号,2表示右括号,3表示独立插头。
在DP之前先进行一次预处理,剔除无效状态,并预处理出与每个括号匹配的另一个括号的位置,有效状态只有8000个左右。
然后分类讨论进行转移即可。
#include<cstdio>
const int N=9,M=8320,inf=-1000000000;
int n,m,S,i,j,k,h,z,ans=inf,q[M],id[1<<(N*2)],pre[M],now[M];
char can,c3,st[N+1],p[M][N],tmp[N];
inline int bit(int x,int i){return x>>(i<<1)&3;}
inline void up(int&a,int b){if(a<b)a=b;}
inline void clr(){for(int k=1;k<=q[0];k++)now[k]=inf;}
inline void nxt(){for(int k=1;k<=q[0];k++)pre[k]=now[k];}
int main(){
scanf("%d%d",&n,&m);
S=1<<(2*(m+1));
for(i=0;i<S;i++){
can=1,st[0]=c3=0;
for(j=0;j<=m;j++){
k=bit(i,j);
if(k==1)st[++st[0]]=j;
if(k==2){
if(!st[0]){can=0;break;}
tmp[st[st[0]]]=j;tmp[j]=st[st[0]];
st[0]--;
}
if(k==3)if((++c3)>2){can=0;break;}
}
if(can&&!st[0]){
q[id[i]=++q[0]]=i;
for(j=0;j<=m;j++)p[q[0]][j]=tmp[j];
}
}
clr();
now[1]=0;
nxt();
for(i=1;i<=n;i++){
clr();
for(k=1;k<=q[0];k++)if(pre[k]>inf&&!bit(q[k],m))now[id[q[k]<<2]]=pre[k];
nxt();
for(j=1;j<=m;j++){
scanf("%d",&z),up(ans,z),clr();
for(h=1;h<=q[0];h++)if(pre[h]>inf){
int v=pre[h]+z,k=q[h],x=bit(k,j-1),y=bit(k,j),e=k^(x<<((j-1)<<1))^(y<<(j<<1));
if(!x&&!y){
up(now[h],v-z);
up(now[id[e^(1<<((j-1)<<1))^(2<<(j<<1))]],v);
up(now[id[e^(3<<((j-1)<<1))]],v);
up(now[id[e^(3<<(j<<1))]],v);
}else if(!x||!y){
int t=x+y;
up(now[id[e^(t<<((j-1)<<1))]],v);
up(now[id[e^(t<<(j<<1))]],v);
if(t==3){if(!e)up(ans,v);}
else{
if(x)up(now[id[e^(x<<(p[h][j-1]<<1))]],v);
else up(now[id[e^(y<<(p[h][j]<<1))]],v);
}
}else if(x==1&&y==1)up(now[id[e^(3<<(p[h][j]<<1))]],v);
else if(x==2&&y==1)up(now[id[e]],v);
else if(x==2&&y==2)up(now[id[e^(3<<(p[h][j-1]<<1))]],v);
else if(x==3&&y==3){if(!e)up(ans,v);}
else if(x==3)up(now[id[e^(y<<(p[h][j]<<1))]],v);
else if(y==3)up(now[id[e^(x<<(p[h][j-1]<<1))]],v);
}
nxt();
}
}
return printf("%d",ans),0;
}
BZOJ2310 : ParkII的更多相关文章
- 2019.01.24 bzoj2310: ParkII(轮廓线dp)
传送门 题意简述:给一个m*n的矩阵,每个格子有权值V(i,j) (可能为负数),要求找一条路径,使得每个点最多经过一次且点权值之和最大. 思路:我们将求回路时的状态定义改进一下. 现在由于求的是路径 ...
- 插头dp初探
问题描述 插头dp用于解决一类可基于图连通性递推的问题.用插头来表示轮廓线上的连通性,然后根据连通性与下一位结合讨论进行转移. 表示连通性的方法 与字符串循环最小表示不同,这种方法用于给轮廓线上的联通 ...
- 插头dp题表
bzoj1814: Ural 1519 Formula 1 bzoj3125: CITY bzoj1210: [HNOI2004]邮递员 bzoj2331: [SCOI2011]地板 bzoj1187 ...
- 【BZOJ2310】ParkII 插头DP
[BZOJ2310]ParkII Description Hnoi2007-Day1有一道题目 Park:给你一个 m * n 的矩阵,每个矩阵内有个权值V(i,j) (可能为负数),要求找一条回路, ...
- [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...
- 【BZOJ】2310: ParkII 插头DP
[题意]给定m*n的整数矩阵,求经过所有点至多一次路径的最大数值和.n<=8,m<=100. [算法]插头DP [题解]最小表示法确实十分通用,处理简单路径问题只需要状态多加一位表示独立插 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 「总结」插头$dp$
集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...
- 「插头dp」
Tasklist: 标识设计 神奇游乐园 Manhattan Wiring ParkII 游览计划 CITY: 只用一条回路经过所有可通过的块 括号匹配,注意结束位置不一定是(n,m) 地板: 分已经 ...
随机推荐
- centos安装redis及php-redis扩展
centos安装redis及php-redis扩展 Linux, WEB 七162012 今天公司同事要求在测试机上安装redis,并且要求让php安装上redis的扩展,redis是一个key-v ...
- mac os x查看端口命令
`netstat` 命令 a. `netstat -nat | grep <端口号>` 转自: http://my.oschina.net/foreverich/blog/402252
- 使用virtualenv搭建独立的Python环境
virtualenv可以搭建虚拟且独立的python环境,可以使每个项目环境与其他项目独立开来,保持环境的干净,解决包冲突问题. 一.安装virtualenv virtualenv实际上是一个pyth ...
- Solr5.3.1 SolrJ查询索引结果
通过SolrJ获取Solr检索结果 1.通过SolrParams的方式提交查询参数 SolrClient solr = new HttpSolrClient("http://localhos ...
- centos 单独安装PHP的mysql和mysqli扩展
2013年11月22日 11:25:41 Linux centos 6.3 最小化安装 mysql 5.5 php 5.4 安装PHP时只是 ./configure --prefix=/**** 并没 ...
- WordPress环境配置与安装
要安装wordpress,要安装apache,php,mysql,还要进行一系列复杂的配置,较为复杂. apache安装 php5.5.6 下载链接:http://windows.php.net/do ...
- Windows环境下配置Vim为Python的IDE
(一)安装Python 2.7 在官网下载Python,并安装,我的安装路径是D:\Program Files\Python.安装完成后编辑环境变量Path,在其后添加;D:\Program File ...
- 配置redis外网可访问
redis采用的安全策略,默认会只准许本地访问 通过简单配置,完成允许外网访问 [root@cache01 conf]# egrep "(^bind|#bind|# bind)" ...
- TCP的长连接和短连接
TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应用层有FTP. ...
- ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象
http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value (存一个对象的时候key存) 将哈希 ...