Address

https://www.lydsy.com/JudgeOnline/problem.php?id=4565

Solution

区间合并让人想到区间 dp ,而 k≤8k≤8k\le8 又让人想到状压 dp 。
我们考虑合二为一。
f[l][r][S]f[l][r][S]f[l][r][S] 表示将区间 [l,r][l,r][l,r] 内的字符不断合并,最后变成串 SSS 的最大收益。
( S" role="presentation" style="position: relative;">SSS 是一个长度为 (r−l)mod(k−1)+1(r−l)mod(k−1)+1(r-l)\bmod(k-1)+1 的 010101 串)
(由于每次合并会减少 k−1k−1k-1 个字符,故 SSS 的长度固定)
考虑 S" role="presentation" style="position: relative;">SSS 的每个字符,它们都是由原串的一个区间逐渐压缩成的。
故 SSS 的每个字符互相独立,互不影响。
我们就枚举一个 mid∈[l,r)" role="presentation" style="position: relative;">mid∈[l,r)mid∈[l,r)mid\in[l,r) ,表示 SSS 的最后一个字符是由原串的区间 (mid,r]" role="presentation" style="position: relative;">(mid,r](mid,r](mid,r] 压缩成的。
这时候就有一个非常传统的区间 dp 转移了!
以下把 mg(S,x)mg(S,x)mg(S,x) 定义为 (S<<1)|x(S<<1)|x(S ,即在 SSS 的后面插入 x" role="presentation" style="position: relative;">xxx 。 x∈{0,1}x∈{0,1}x\in\{0,1\} 。

f[l][r][mg(S,x)]=max(f[l][r][mg(S,x)],f[l][mid][S]+f[mid+1][r][x])f[l][r][mg(S,x)]=max(f[l][r][mg(S,x)],f[l][mid][S]+f[mid+1][r][x])

f[l][r][mg(S,x)]=\max(f[l][r][mg(S,x)],f[l][mid][S]+f[mid+1][r][x])
其中 x∈{0,1}x∈{0,1}x\in\{0,1\} 。
注意上面针对的是 |S|=(r−l)mod(k−1)+1<k−1|S|=(r−l)mod(k−1)+1<k−1|S|=(r-l)\bmod(k-1)+1 的情况。
如果 |S|=k−1|S|=k−1|S|=k-1 ,那么 [l,mid][l,mid][l,mid] 会和 (mid,r](mid,r](mid,r] 组成一个长度为 kkk 的串,还可以再次合并。
故当 |S|=k−1" role="presentation" style="position: relative;">|S|=k−1|S|=k−1|S|=k-1 时:

f[l][r][cmg(S,x)]=max(f[l][r][cmg(S,x)],f[l][mid][S]+f[mid+1][r][x]+wmg(S,x))f[l][r][cmg(S,x)]=max(f[l][r][cmg(S,x)],f[l][mid][S]+f[mid+1][r][x]+wmg(S,x))

f[l][r][c_{mg(S,x)}]=\max(f[l][r][c_{mg(S,x)}],f[l][mid][S]+f[mid+1][r][x]+w_{mg(S,x)})
同样 x∈{0,1}x∈{0,1}x\in\{0,1\} 。
理论复杂度 O(2kn3)O(2kn3)O(2^kn^3) ,但实际状态没有那么多。

Code

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define For(i, a, b) for (i = a; i <= b; i++)
#define Rof(i, a, b) for (i = a; i >= b; i--)
#define Step(i, a, b, x) for (i = a; i <= b; i += x)
using namespace std;
inline int read() {int res = 0; bool bo = 0; char c;while (((c = getchar()) < '0' || c > '9') && c != '-');if (c == '-') bo = 1; else res = c - 48;while ((c = getchar()) >= '0' && c <= '9')res = (res << 3) + (res << 1) + (c - 48);return bo ? ~res + 1 : res;
}
typedef long long ll;
const int N = 305, M = (1 << 8) + 5;
int n, k, a[N], c[M], w[M];
ll f[N][N][M >> 1];
int main() {int i, j, mid, S;n = read(); k = read();For (i, 1, n) a[i] = read();For (i, 0, (1 << k) - 1) c[i] = read(), w[i] = read();memset(f, -1, sizeof(f));For (i, 1, n) f[i][i][a[i]] = 0;Rof (i, n, 1) For (j, i + 1, n) {int orz = (j - i) % (k - 1) + 1;if (orz > 1)Step (mid, i + orz - 2, j - 1, k - 1)For (S, 0, (1 << orz - 1) - 1) {if (f[i][mid][S] == -1) continue;if (f[mid + 1][j][0] != -1)f[i][j][S << 1] = max(f[i][j][S << 1],f[i][mid][S] + f[mid + 1][j][0]);if (f[mid + 1][j][1] != -1)f[i][j][(S << 1) | 1] = max(f[i][j][(S << 1) | 1],f[i][mid][S] + f[mid + 1][j][1]);}else For (S, 0, (1 << k - 1) - 1) {int tr0 = c[S << 1], tr1 = c[(S << 1) | 1];Step (mid, i + k - 2, j - 1, k - 1) {if (f[i][mid][S] == -1) continue;if (f[mid + 1][j][0] != -1)f[i][j][tr0] = max(f[i][j][tr0], f[i][mid][S]+ f[mid + 1][j][0] + w[S << 1]);if (f[mid + 1][j][1] != -1)f[i][j][tr1] = max(f[i][j][tr1], f[i][mid][S]+ f[mid + 1][j][1] + w[(S << 1) | 1]);}}}ll ans = -1;For (i, 0, (1 << k) - 1) ans = max(ans, f[1][n][i]);cout << ans << endl;return 0;
}

[BZOJ4565][Haoi2016]字符合并(区间状压dp)相关推荐

  1. bzoj4565 [HAOI2016]字符合并 结论+状压+区间dp

    如果k==2的话就是记搜, 但这个题用记搜的思路的话是需要枚举k个断点的, 所以对于枚举断点,就很可能有优化,比如到一个断点,一个决策的最优值 于是考虑区间dp模型,相当于是插入一个数,然后看影响. ...

  2. 【BZOJ 4565】 [Haoi2016]字符合并 区间dp+状压

    考试的时候由于总是搞这道题导致爆零~~~~~(神™倒序难度.....) 考试的时候想着想着想用状压,但是觉得不行又想用区间dp,然而正解是状压着搞区间,这充分说明了一件事,状压不是只是一种dp而是一种 ...

  3. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

  4. [HAOI2016]字符合并(ing)

    [HAOI2016]字符合并 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 有一个长度为 ...

  5. 中石油训练赛 - Watch Later(状压dp)

    题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...

  6. 【校内互测】Sunshine’s string(merge) (状压dp)

    Sunshine's string(merge.cpp) [问题描述] 无聊的Sunshine大爷开始研究字符串.他找来了一个长度为n的01字符串,并制定了一些规则:每次可以将k个字符合并,得到一个新 ...

  7. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  8. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  9. 【思维题 状压dp】APC001F - XOR Tree

    可能算是道中规中矩的套路题吧-- Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...

最新文章

  1. 在Android中取得当前进程名
  2. HDU 2473 Junk-Mail Filter(并查集的删除操作)
  3. 机器学习博主推荐、博文推荐
  4. python数据分析准备_使用Python进行数据分析I 环境准备
  5. 农村初中学校计算机课的意义,关于农村学校计算机课件使用的反思.pdf
  6. Qt文档阅读笔记-Q_ASSERT的另外一总用法(大佬用法)
  7. 广州专科计算机学校录取分数线,广州大专多少分能录取?高考分数170分能上广州大专?...
  8. Cisco正式停止MARS产品的销售
  9. 2014.8.25二分法,二维数组
  10. 阿里云ACA课程之阿里云简介
  11. 二项分布的特征函数及期望与方差 - 随机过程
  12. 江苏计算机编程中小学,编程教育走进小学低年级
  13. [Codeforces730A. Toda 2] STL模拟+Skills
  14. OpenTracing语义标准
  15. 微信支付当前页面的URL未注册问题[单页面]
  16. DS1602液晶显示学习笔记
  17. 【独立按键鼠标式的单击与双击】
  18. 1 语言模型和词向量
  19. 如果如果,如果没有如果
  20. android视频播放器流程图,Android OpenGL ES 10.1 视频播放器

热门文章

  1. VirtualBox快捷键
  2. 傅立叶逼近 matlab,傅里叶逼近.doc
  3. java des ecb_DES ECB加解密的Java实现
  4. 实用一位加法电路-全加器(全加器真值表、全加器的逻辑组合电路)、几种基本组合逻辑电路真值表 补充:逻辑电路基础:与门、或门、非门----计算机组成原理
  5. 牛客Steins;Gate(原根+FFT)
  6. CentOS服务器密匙登录
  7. 后羿采集器怎么导出数据_怎么安装后羿采集器?后羿网页数据采集器安装教程...
  8. 透明、反光材质护肤品拍摄技巧
  9. Docker 使用OpenJDK 验证码无法显示
  10. 解决Apple Watch 更新时出现红色感叹号「!」的问题