单路径最大和问题,设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的更多相关文章

  1. 2019.01.24 bzoj2310: ParkII(轮廓线dp)

    传送门 题意简述:给一个m*n的矩阵,每个格子有权值V(i,j) (可能为负数),要求找一条路径,使得每个点最多经过一次且点权值之和最大. 思路:我们将求回路时的状态定义改进一下. 现在由于求的是路径 ...

  2. 插头dp初探

    问题描述 插头dp用于解决一类可基于图连通性递推的问题.用插头来表示轮廓线上的连通性,然后根据连通性与下一位结合讨论进行转移. 表示连通性的方法 与字符串循环最小表示不同,这种方法用于给轮廓线上的联通 ...

  3. 插头dp题表

    bzoj1814: Ural 1519 Formula 1 bzoj3125: CITY bzoj1210: [HNOI2004]邮递员 bzoj2331: [SCOI2011]地板 bzoj1187 ...

  4. 【BZOJ2310】ParkII 插头DP

    [BZOJ2310]ParkII Description Hnoi2007-Day1有一道题目 Park:给你一个 m * n 的矩阵,每个矩阵内有个权值V(i,j) (可能为负数),要求找一条回路, ...

  5. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...

  6. 【BZOJ】2310: ParkII 插头DP

    [题意]给定m*n的整数矩阵,求经过所有点至多一次路径的最大数值和.n<=8,m<=100. [算法]插头DP [题解]最小表示法确实十分通用,处理简单路径问题只需要状态多加一位表示独立插 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. 「总结」插头$dp$

    集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...

  9. 「插头dp」

    Tasklist: 标识设计 神奇游乐园 Manhattan Wiring ParkII 游览计划 CITY: 只用一条回路经过所有可通过的块 括号匹配,注意结束位置不一定是(n,m) 地板: 分已经 ...

随机推荐

  1. 关于 CAS 不能登录的问题

    经过排查,是因为 Capistrano 部署中设置了 http_proxy.此时通过 cas.m.xxxx.com 域名去访问 CAS 服务时,就不通了,需要修改为 IP 来访问. 但是公司的 CAS ...

  2. HDU 1505 City Game (hdu1506 dp二维加强版)

    F - City Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  3. php email邮箱正则验证

    国际域名格式如下: 域名由各国文字的特定字符集.英文字母.数字及“-”(即连字符或减号)任意组合而成, 但开头及结尾均不能含有“-”,“-”不能连续出现 . 域名中字母不分大小写.域名最长可达60个字 ...

  4. BZOJ 3540 realtime-update 解题

    分析一下题意,大约是给定一串牛,然后找到一个跨越距离最长的牛子串使得在这个范围内白牛和花牛一样多. 白牛可以任意涂成花牛. 既然"白牛可以任意涂成花牛",那么我们需要找到一个最长的 ...

  5. 使用ifconfig命令给网卡配置ip别名

    给网卡eth0配置一个ip别名 sudo ifconfig eth0:0 10.108.125.6/22 up 若想保存该配置,以便每次开机都可以使用该ip别名,则应 sudo vim /etc/ne ...

  6. linux下复制一个文件的内容到另一个文件

    cat path/to/file/filename1 >> path/to/file/filename2 例如: cat id_rsa.pub >> ~/.ssh/author ...

  7. iOS 用protocol 和 用继承小体会

    最近写程序时,2个类都有相同的函数,又因为在用oc,所以就用了protocol来实现.后来发现其实这2个类除了相同的函数,还需要一些相同的变量,当初用继承的话会更简单.

  8. Java for LeetCode 078 Subsets

    Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...

  9. Java程序编译和运行的过程

    Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode)  2 ...

  10. js监听密码输入框type

    1.密码输入框 <input class="oaInput oaText" type="text" placeholder="请输入用户名&qu ...