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 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
随机推荐
- Scala 学习笔记之集合(8) Try和Future
import util._ import concurrent.ExecutionContext.Implicits.global import concurrent.Future import co ...
- 【solved】must have one register DataBase alias named `default`
beego在初始化MySQL数据库时报错处理 1.报错提示: ... [ORM]2019/10/11 08:42:52 register db Ping `default`, dial tcp 192 ...
- 重学Golang系列(一): 深入理解 interface和reflect
前言 interface(即接口),是Go语言中一个重要的概念和知识点,而功能强大的reflect正是基于interface.本文即是对Go语言中的interface和reflect基础概念和用法的一 ...
- JavaScript事件属性event.target和currentTarget 属性的区别。
event.target 获取的是触发事件的标签元素 event.currentTarget 获取到的是发起事件的标签元素 一.事件属性:event.target target事件委托的定义:本来该自 ...
- .Net下MoongoDB的简单调用
1.安装.Net 驱动:Install-Package MongoDB.Driver 2.数据插入 //新建Person测试类 public class Person { public long Id ...
- NOIP2011计算系数;
#include<cmath> #include<algorithm> #include<stdio.h> #include<iostream> #de ...
- 解决:Specifying a namespace in include() without providing an app_name和XXX is not a registered namespace问题
python3 Django 环境下,如果你遇到namespace没有注册以及在根目录下urls.py中的include方法的第二个参数namespace添加之后就出错的问题. 出错问题: 'Spec ...
- Dropzone.js
2015-11-25 发布 DropzoneJS 官网没有中文版的,很多东西只能跟着自己的感觉去理解,有些地方把握不了是否准确,在网上搜了一下中文版,看到一位大神简易的中文版 个人觉得和原官网对比着看 ...
- Javascript字符串常用方法详解
字符串 字符串就是一个或多个排列在一起的字符,放在单引号或双引号之中. 'abc'"abc" length属性 js里的字符串类似于数组,都是一个一个字符拼凑在一起组成的,因此可以 ...
- 【RabbitMQ 实战指南】一 RabbitMQ 开发
1.RabbitMQ 安装 RabbitMQ 的安装可以参考官方文档:https://www.rabbitmq.com/download.html 2.管理页面 rabbitmq-management ...