[杂题]:group(状压DP+轮廓线)
题目描述
$pure$在玩一个战略类游戏。现在有一个士兵方阵,每行有若干士兵,每个士兵属于某个兵种。行的顺序不可改变,且每一行中士兵的顺序也不可改变。但由于每一行都有$C$个位置($C$不小于任一行的士兵数),她能够安排每行的士兵依次站在某几个位置上。
对于每一个士兵,令其前后左右相邻四个位置上有$v$个和他种类相同的士兵,则$pure$会获得$v$的布阵分数。现在$pure$想知道她最多能够获得多少布阵分数。
输入格式
第一行包含两个整数$R,C$,分别表示行数,以及每一行的位置数。
接下来$R$行,每行一个由大写字母构成的字符串,同一字母的士兵为同一种类。
输出格式
一行一个整数,表示$pure$能够获得的最高布阵分数。
样例
样例输入:
2 5
ABBCD
AC
样例输出:
6
数据范围与提示
样例解释:
布阵如下:
ABBCD
A__C_
共获得$6$分。
数据范围:
对于$20\%$的数据,$R\leqslant 3,C\leqslant 4$;
对于$40\%$的数据,$R\leqslant 16$;
对于$100\%$的数据,$R\leqslant 128,C\leqslant 16$,字符串长度不超过$C$。
题解
我们可以只考虑左边和上边的格子,因为兵种一样是相互的,所以最后再乘$2$即可。
先考虑暴力的状压,无非就是枚举上一行的状态,然后再枚举本行的状态,取$\max$,时间复杂度是$\Theta((C_C^{\frac{C}{2}})^2\times C\times R)$的。
然后,我们发现,瓶颈就在于枚举所有的状态,所以我们可以利用轮廓线。
如果你打过插头$DP$,这将非常好理解,枚举行变成了枚举单个格,能对其作出贡献的只有其左边和上边的格了。
代码实现稍繁琐……
时间复杂度:$\Theta(2^C\times C\times R)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int r,c;
char ch[20];
int Map[150][20];
int Mapl[100000][20],Mapr[100000][20];
int dp[2][100000];
bool now;
int ans;
int main()
{
scanf("%d%d",&r,&c);
for(int i=1;i<=r;i++)
{
scanf("%s",ch+1);
Map[i][0]=strlen(ch+1);
for(int j=1;j<=Map[i][0];j++)
Map[i][j]=ch[j]-'A'+1;
}
memset(dp,-0x3f,sizeof(dp));
dp[0][0]=0;
for(int i=0;i<(1<<c);i++)
{
for(int j=2;j<=c+1;j++)
Mapl[i][j]=Mapl[i][j-1]+(i&(1<<(j-2))?1:0);
for(int j=c-1;j;j--)
Mapr[i][j]=Mapr[i][j+1]+(i&(1<<j)?1:0);
}
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
now^=1;
memset(dp[now],-0x3f,sizeof(dp[now]));
for(int k=0;k<(1<<c);k++)
{
if(Map[i][Mapl[k][j]+1])
dp[now][((((k>>j)<<1)|1)<<(j-1))|(k&((1<<(j-1))-1))]=max(dp[now][((((k>>j)<<1)|1)<<(j-1))|(k&((1<<(j-1))-1))],dp[!now][k]+(((k&(1<<j-2))?Map[i][Mapl[k][j]]:0)==Map[i][Mapl[k][j]+1])+(((k&(1<<j-1))?Map[i-1][Map[i-1][0]-Mapr[k][j]]:0)==Map[i][Mapl[k][j]+1]));
dp[now][((((k>>j)<<1)|0)<<(j-1))|(k&((1<<(j-1))-1))]=max(dp[now][((((k>>j)<<1)|0)<<(j-1))|(k&((1<<(j-1))-1))],dp[!now][k]);
}
}
for(int j=0;j<(1<<c);j++)
if(Mapl[j][c+1]!=Map[i][0])dp[now][j]=-0x3f3f3f3f;
}
for(int i=0;i<(1<<c);i++)
ans=max(ans,dp[now][i]);
printf("%d",(ans<<1));
return 0;
}
rp++
[杂题]:group(状压DP+轮廓线)的更多相关文章
- [luoguP3694] 邦邦的大合唱站队/签到题(状压DP)
传送门 来自kkk的题解: 70分做法:枚举每个学校顺序,暴力. 100分:状压dp.从队列头到尾DP, 状态:f[i]表示i状态下最小的出列(不一致)的个数. 比如f[1101]表示从头到位为1/3 ...
- group:状压dp,轮廓线
神仙题.但是难得的傻孩子cbx没有喊题解,所以也就难得的自己想出来了一个如此神仙的题. 如果是自己想的,说它神仙是不是有点不合适啊..? 反正的确不好像.关键就在于这个标签.颓完标签就差不多会了. % ...
- 【专业找水题】状压dp最水题,没有之一
题目链接 现在代码能力没上升,倒是越来越会找水题了(比例题还水的裸题你值得拥有) 这网站不是针对竞赛的,所以时空限制都很宽松 然后就让我水过去了 对于每个点,包括自己的前m个元素是否取都是一种状态,所 ...
- group 状压dp
应某些人要求,我把标签删掉了 这是一道好题. 一看$c<=16$果断状压,但是怎么压? 一个很显然的思路是,枚举上下两层的状态,每一层的状态极限有$C(c,c/2)$,c=16的时候有13000 ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- 刷题向》关于第一篇状压DP BZOJ1087 (EASY+)
这是本蒟蒻做的第一篇状压DP,有纪念意义. 这道题题目对状压DP十分友善,算是一道模板题. 分析题目,我们发现可以用0和1代表每一个格子的国王情况, 题目所说国王不能相邻放置,那么首先对于每一行是否合 ...
- 【bzoj1087】【互不侵犯King】状压dp裸题(浅尝ACM-D)
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=54329606 向大(hei)佬(e)势力学(di ...
- QDUOJ 来自xjy的签到题(bfs+状压dp)
来自xjy的签到题 Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1 ...
- POJ 3254 Corn Fields (状压DP,轮廓线DP)
题意: 有一个n*m的矩阵(0<n,m<=12),有部分的格子可种草,有部分不可种,问有多少种不同的种草方案(完全不种也可以算1种,对答案取模后输出)? 思路: 明显的状压DP啦,只是怎样 ...
随机推荐
- 如何根据字典值的大小,对字典中的项排序---Python数据结构与算法相关问题与解决技巧
实际案例: 某班英语成绩以字典形式存储为: { 'LiLei' : 90, 'Jim' : 88, 'Lucy': 92 } 如何根据成绩高低,计算学生排名 -- 根据分数,进行排名,并且把排名信息添 ...
- Scratch可视化的编程工具
1.是什么? 在线编程网址 是一个编程软件,但是不涉及编程语言,是针对青少年开发的编程积木模块. 2.软件的目的是什么? 激发青少年对编程的兴趣 3.怎么用呢? 软件内部是很多积木模块,需要明白每块是 ...
- Adam Optimization Algorithm
曾经多次看到别人说起,在选择Optimizer的时候默认就选Adam.这样的建议其实比较尴尬,如果有一点科学精神的人,其实就会想问为什么,并搞懂这一切,这也是我开这个Optimizer系列的原因之一. ...
- <搬运> SQL语句百万数据量优化方案
一:理解sql执行顺序 在sql中,第一个被执行的是from语句,每一个步骤都会产生一个虚拟表,该表供下一个步骤查询时调用,比如语句:select top 10 column1,colum2,max( ...
- GNU MAKE 笔记
最近在调试OJ, 忙了4天多, 最后的问题是judge模块不能正常工作. judge 模块就是两个C++源文件, 它的工作是 从数据库获取用户提交的源码 测评 将测评结果写到数据库 测评部分是与数据库 ...
- vue.js2.0 (简易)水果商城 vuex vant-ui
vue.js2.0 (简易)水果商城 vuex vant-ui:https://segmentfault.com/a/1190000015690250 vue2.5全家桶 高仿vivo商城 百分之95 ...
- Codeforces - 1191C - Tokitsukaze and Discard Items - 模拟
https://codeforces.com/contest/1191/problem/C 一开始想象了一下,既然每次删除都是往前面靠,那么好像就是页数*页容量+空位数=最多容纳到的坐标. 至于为什么 ...
- uploadify多图片和文件上传网站应用
先要下载压缩包 www.uploadify.com/wp-content/uploads/files/uploadify.zip 1,模板文件引用 <!--引用jquery uploady*}- ...
- J Less taolu
链接:https://ac.nowcoder.com/acm/contest/338/J来源:牛客网 题目描述 Less taolu, more sincerity. This problem is ...
- untiy3D-初学NGUI遇到问题
1,如果需要能在场景中右键添加NGUI的控件,我们需要做好下图两个框住的地方 第一个框可以使用键盘的W选中,或者鼠标点击 第二个框我们选中UIRoot然后保持它的脚本文件为打开状态,才可以使用右键添加 ...