应某些人要求,我把标签删掉了

  这是一道好题。

  一看$c<=16$果断状压,但是怎么压?

  一个很显然的思路是,枚举上下两层的状态,每一层的状态极限有$C(c,c/2)$,c=16的时候有13000左右,显然是死掉了。

  我们考虑换个角度。上下两层的状态数太多,那我们不妨只考虑一层,而每个点只与它上下左右四个点有关,在dp的时候也只需要考虑上面和左边的数,多余的点在转移完右边和下边之后就失去了用处,那么我们不妨扔掉它们。

  想到这个之后这道题就比较简单了。

  我们令$f[i][j][k]$表示当前考虑第i行第j个位置,状态为k时候的状态数,转移思路和插头dp有些类似,考虑当前格上面和左边是否有字母转移即可

  这道题很多思路都和插头dp有些相近的地方。

  理论复杂度$O(rc2^c)$,实际则远远达不到(达到了复杂度也是对的)

 #include<bits/stdc++.h>
using namespace std;
int r,c,cur,la,ans;
char s[][];
struct hash_map{
int fi[],ne[];
int val[],tot,f[];
inline void clear(){
tot=;memset(fi,,sizeof(fi));
}
inline int &operator [](int x){
int y=x%,i=fi[y];
for(;i&&val[i]!=x;i=ne[i]);
if(!i) ne[++tot]=fi[y],fi[y]=i=tot,val[tot]=x,f[i]=;
return f[i];
}
}g[];
inline int count(int x,int y){
int cnt=;
for(int i=;i<y;i++) cnt+=((x&)>>),x>>=;
return cnt;
}
inline int count2(int x,int y){
int cnt=;
for(int i=c;i>=y;i--)
if(x&(<<i)) cnt++;
return cnt;
}
int main(){
cin>>r>>c;
for(int i=;i<=r;i++) scanf("%s",s[i]+);
g[][]=;
for(int i=;i<=r;i++){
int len=strlen(s[i]+),lea=strlen(s[i-]+);
for(int j=;j<=c;j++){
la=cur,cur^=;g[cur].clear();
for(int k=;k<=g[la].tot;k++){
int v=g[la].val[k],f=g[la].f[k],c1=count(v,j-),c2=lea-count2(v,j)+;
if(len-c1>c-j+)continue;
if((v&(<<j-))&&(v&(<<j))&&c1<len) g[cur][v]=max(g[cur][v],f+(s[i][c1+]==s[i][c1])+(s[i-][c2]==s[i][c1+]));
else if(v&(<<j-)&&c1<len) g[cur][v|(<<j)]=max(g[cur][v|(<<j)],f+(s[i][c1+]==s[i][c1]));
else if(v&(<<j)&&c1<len) g[cur][v]=max(g[cur][v],f+(s[i][c1+]==s[i-][c2]));
else if(c1<len) g[cur][v|(<<j)]=max(g[cur][v|(<<j)],f);
if(len-c1<=c-j)g[cur][(v|(<<j))^(<<j)]=max(g[cur][(v|(<<j))^(<<j)],f);
}
}
}
for(int i=;i<=g[cur].tot;i++)
if(count(g[cur].val[i],c)==strlen(s[r]+))
ans=max(ans,g[cur].f[i]);
printf("%d\n",ans<<);
return ;
}

group 状压dp的更多相关文章

  1. group:状压dp,轮廓线

    神仙题.但是难得的傻孩子cbx没有喊题解,所以也就难得的自己想出来了一个如此神仙的题. 如果是自己想的,说它神仙是不是有点不合适啊..? 反正的确不好像.关键就在于这个标签.颓完标签就差不多会了. % ...

  2. hdu5304 Eastest Magical Day Seep Group&#39;s Summer 状压dp+生成树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5304 16个点的无向图,问能生成多少个n条边的连通图.(即多一条边的树) 先n^3 * 2^n 枚举全部的 ...

  3. BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS

    BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...

  4. HDU 2923 Relocation(状压dp+01背包)

    题目代号:HDU2923 题目链接:http://poj.org/problem?id=2923 Relocation Time Limit: 1000MS Memory Limit: 65536K ...

  5. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  6. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  7. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  8. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  9. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

随机推荐

  1. IDEA 学习笔记之 Scala项目开发

    Scala项目开发: 由于直接下载Scala plugin太慢,老是中断,所以手动下载: https://plugins.jetbrains.com/ 手动安装Scala plugin: 新建Scal ...

  2. MySQL 数据库删除表中重复数据

    采集数据的时候,由于先期对页面结构的分析不完善,导致采漏了一部分数据.完善代码之后重新运行 Scrapy,又采集了一些重复的数据,搜了下删除重复数据的方法. N.B. 删除数据表的重复数据时,请先备份 ...

  3. InfluxDB从原理到实战 - InfluxDB常用的基础操作

    0x00 基础操作介绍 在本文中将介绍InfluxDB常用的基础操作,帮助读者建立对InfluxDB的感性认识,快速的动手玩起来,持续查询(Continuous Queies).Group by.Se ...

  4. SpringBoot自动注入分析

    我们经常会被问到这么一个问题:SpringBoot相对于spring有哪些优势呢?其中有一条答案就是SpringBoot自动注入.那么自动注入的原理是什么呢?我们进行如下分析. 1:首先我们分析项目的 ...

  5. Python玩转人工智能最火框架 TensorFlow应用实践 ☝☝☝

    Python玩转人工智能最火框架 TensorFlow应用实践 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 全民人工智能时代,不甘心只做一个旁观者,那就现在 ...

  6. 计算机网络知识点总结2:IP协议(IPV4)

    一.Internet网络是一种数据报网络(另一种是虚电路网络,用于ATM等),主要功能是路由和转发. 二.IP数据报(分组)格式(IPV4版本) 首部 描述 版本号(4bit) 描述IP协议的版本号, ...

  7. ZCU104搭建Ubuntu桌面系统-1安装Petalinux

    参考教程: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841948/Zynq+UltraScalePlus+MPSoC+-+Ubu ...

  8. php后端开发要学什么

    PHP历史: 1994年创建,1995年对外发表第一个版本,名为:personal home page tools,之后发表PHP1.0.1995年中期,PHP2.0,从此建立了PHP在动态网站开发的 ...

  9. Go.js 没有中文文档 也没有中文demo 学起来很费劲 给大家整理一个算是详细的文档

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  10. shell基本运算符(五)

    shell支持多种运算符,包括:算术运算符.关系运算符.布尔运算符.字符串运算符.文件测试运算符. 注意:条件表达式要放在方括号之间,并且要有空格,eg:[$a==$b] 是错误的,必须写成 [ $a ...