group 状压dp
应某些人要求,我把标签删掉了
这是一道好题。
一看$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的更多相关文章
- group:状压dp,轮廓线
神仙题.但是难得的傻孩子cbx没有喊题解,所以也就难得的自己想出来了一个如此神仙的题. 如果是自己想的,说它神仙是不是有点不合适啊..? 反正的确不好像.关键就在于这个标签.颓完标签就差不多会了. % ...
- hdu5304 Eastest Magical Day Seep Group's Summer 状压dp+生成树
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5304 16个点的无向图,问能生成多少个n条边的连通图.(即多一条边的树) 先n^3 * 2^n 枚举全部的 ...
- 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 ...
- HDU 2923 Relocation(状压dp+01背包)
题目代号:HDU2923 题目链接:http://poj.org/problem?id=2923 Relocation Time Limit: 1000MS Memory Limit: 65536K ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
随机推荐
- java的日期时间处理(待更新)
1. /* * 将时间转换为时间戳 */ public static String dateToStamp(String s) throws ParseExcepti ...
- JS的加减乘除高精度
//除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:accDiv(arg1,arg2) ...
- (转) websocket 和 socket 剖析
Socket 与 WebSocket 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文 ...
- Spring 源码阅读 一
终于,有一天我也来看Spring的源码了,看了一阵之后感觉心情那叫一个舒畅,对Spring底层的实现也有了进一步的了解, 最直观的感受就是Spring的命名风格很赞,很长,真的长到使人见名知意, 闲言 ...
- 未来实现API管理系统的几个关键词
下面将通过几个关键词的形式说明API管理的重要性和未来的实现方式. 1.生命周期管理 在整个API生命周期中更深入地集成所有工具将进一步提高生命周期循环的速度,而且更重要的是提供满足消费者需求的API ...
- 【从刷面试题到构建知识体系】Java底层-synchronized锁-1
在技术论坛中,经常看到一种言论:面试造火箭,干活拧螺丝.我们平时写的大部分代码的确是CRDU,再提一个层次,也无非就是揉进去复杂一些的业务逻辑,把一堆的CRDU组合起来. 那么问题来了:我们提倡的研究 ...
- Web页面解析过程(浅)
web页面流程 域名解析DNS 域名解析:把域名指向网络空间IP,让人们通过简单的域名访问Web网站的服务. DNS:域名系统 DNS服务器:记录着域名及其对应的IP地址 解析域名: 浏览器中输入 ...
- [ERROR ImagePull]: failed to pull image [k8s.gcr.io/kube-apiserver-amd64:v1.11.1]: exit status 1
问题描述 [root@localhost ~]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 ...
- 让你如“老”绅士般编写 Python 命令行工具的开源项目:docopt
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 使用Prometheus监控SpringBoot应用
通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用.(本文以SpringBoot 2.1.9.REL ...