单路径最大和问题,设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. HDOJ 1272 并查集

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  2. 【转】Eclipse中查看jar包中的源码

    (简单的方式:通过jd-gui来进行反编译,最简单!,参考我的另一篇博文, 地址:http://www.cnblogs.com/gmq-sh/p/4277991.html) Java Decompil ...

  3. linux 学习一:安装jdk和tomcat

    使用secureCRT 一.首先安装centos的rzsz. 1.yum自动安装:(yum安装rzsz) yum install lrzsz 2.手动安装方法如下:(包有问题,还是采用第一种方式) 2 ...

  4. cocos2dx阴影层的实现

    效果图 //ShadowLayer.h class ShadowLayer : public CCLayer { protected: ShadowLayer() :m_pRender(NULL) , ...

  5. 【USACO】sprime

    有了前面的基础,做这道题真是so easy啊. 因为要分解后每个数都是素数,所以采用先生成短的素数,长的素数在短素数的基础上生成. 比如长度为1的素数只有 2 3 5 7, 那么符合要求的长度为2的素 ...

  6. Fresco 源码分析(二) Fresco客户端与服务端交互(3) 前后台打通

    4.2.1.2.4 PipelineDraweeControllerBuilder.obtainController()源码分析 续 上节中我们提到两个核心的步骤 obtainDataSourceSu ...

  7. tar -cvPf new.tar `rpm -ql vsftpd` 建议不要用绝对路径'/'

    tar -cvPf new.tar `rpm -ql vsftpd` 解压这样的压缩包,会在当前用户的家目录下解压:~./xxxx;加参数-C :tar -xvf xxx.tar -C /  ;来指定 ...

  8. JUC回顾之-Semaphore底层实现和原理

    1.控制并发线程数的Semaphore Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,保证合理的使用公共资源. 线程可以通过acquire()方法来获取信号量的 ...

  9. oracle 10g 学习之基本 SQL SELECT 语句(4)

    本篇文章中,对于有的和MSSQL Server相同的语法我就没有再写了,这里我只写Oracle和MSSQL Server有点不同的 定义空值 l  空值是无效的,未指定的,未知的或不可预知的值 l  ...

  10. WPF入口Application

    1.WPF和 传统的WinForm 类似, WPF 同样需要一个 Application 来统领一些全局的行为和操作,并且每个 Domain (应用程序域)中只能有一个 Application 实例存 ...