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 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
随机推荐
- 定期从Docker上部署的MySQL备份数据
前段时间公司停电,正巧赶上周一领导要开会要过一遍项目,然而项目所依赖的MySQL数据库是直接部署在宿主机,且因为各人部署方式不同的原因,花了很久才在开会前启动起来.于是开完会后,我第一件事就是把原先依 ...
- package.json详解
1.概念 Node.js项目遵循模块化的架构,当我们创建了一个Node.js项目,意味着创建了一个模块,这个模块的描述文件,被称为package.json 亦即:模块的描述文件 = package.j ...
- ASP.NET Web API 2系列(二):灵活多样的路由配置
1. 导言 路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的在于利用注册的路由对请求的URL进行解析以确定目标HTTPController和Action的名称, ...
- docker相关概念介绍
关键词:docker容器与docker镜像 他们之间的关系是docker容器通过docker镜像来创建 docker镜像就是些像ubuntu15.10,ubuntu14.2一样的系统 docker容器 ...
- cocos2d-x C++ 工程初探
经过较为繁琐的环境搭建后,我们终于运行出了一个helloworld窗口,可以正式上手cocos了 现在我们就从改代码开始玩起 窗口 我们之前讲到AppDelegate类是程序的入口,所以和窗口有关的设 ...
- JZOJ 3875 星球联盟
[问题描述] 在遥远的 S 星系中一共有 N 个星球,编号为 1…N.其中的一些星球决定组成联盟, 以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这 N 个星球间有 M 条太空 ...
- Redis之安装配置(Windows)
下载 下载地址:https://github.com/MSOpenTech/redis/releases 解压,文件的名字重命名为redis. 打开文件夹,内容如下: 发送redis-server.e ...
- ES三节点重启后报错no known master node
问题 一直在研究ES的监控怎么做,想偷点懒,不去通过API获取然后计算,就想找个现成的插件或者监控软件,只要装个agent就可以,然后就找到了x-pack,插件装好了之后,需要重启ES集群,线上的ES ...
- Python学习笔记五(读取提取写入文件)
#Python打开读取一个文件内容,然后写入一个新的文件中,并对某些字段进行提取,写入新的字段的脚本,与大家共同学习. import os import re def get_filelist(dir ...
- Python爬取猫眼电影100榜并保存到excel表格
首先我们前期要导入的第三方类库有; 通过猫眼电影100榜的源码可以看到很有规律 如: 亦或者是: 根据规律我们可以得到非贪婪的正则表达式 """<div class ...