「BZOJ 4565」「HAOI 2016」字符合并「区间状压DP」
题意
给一个长度为\(n(\leq 300)\)的\(01\)串,每次可以把\(k(\leq 8)\)个相邻字符合并,得到新字符和一定分数,最大化最后的得分
题解
考虑设计dp:\(dp[S][i][j]\)表示区间\([i, j]\)合并为\(S\),最大得分是多少。
这么考虑一定是不遗漏的。如果\([i, j]\)留下来的区间长度\(>k\),那这个合并方案一定会在包含它的大区间计算到,所以我们只考虑能合并都合并完的情况
枚举缩完最后一个位是啥,这对应\([i, j]\)的一个长度\(\bmod k-1\)为\(1\)后缀
然后再考虑这个区间缩成一个字符的情况。由于顺序混乱(比如\(0\)更新\(1\),\(1\)又更新\(0\)),拿临时数组存,最后再赋值回去
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N = 310;
int n, k, c[1 << 8], la[N];
ll w[1 << 8], g[2], dp[1 << 8][N][N];
char s[N];
void upd(ll &x, ll y) { x = max(x, y); }
int main() {
scanf("%d%d%s", &n, &k, s + 1);
for(int i = 0; i < (1 << k); i ++) scanf("%d%lld", c + i, w + i);
for(int i = 1, j; i <= n; i ++) {
for(j = i; j >= k; j = j - k + 1);
la[i] = j;
}
memset(dp, -1, sizeof dp);
for(int i = 1; i <= n; i ++) dp[s[i] -= '0'][i][i] = 0;
for(int i = n - 1; i >= 1; i --) {
for(int j = i + 1; j <= n; j ++) {
for(int u = j; u > i; u -= k - 1) {
for(int S = 0; S < (1 << la[u - i]); S ++) if(~ dp[S][i][u - 1]) {
if(~ dp[0][u][j]) upd(dp[S << 1][i][j], dp[S][i][u - 1] + dp[0][u][j]);
if(~ dp[1][u][j]) upd(dp[S << 1 | 1][i][j], dp[S][i][u - 1] + dp[1][u][j]);
}
}
if(la[j - i + 1] == 1) {
g[0] = g[1] = -1;
for(int S = 0; S < (1 << k); S ++) if(~ dp[S][i][j]) {
upd(g[c[S]], dp[S][i][j] + w[S]);
}
dp[0][i][j] = g[0]; dp[1][i][j] = g[1];
}
}
}
ll ans = -1;
for(int S = 0; S < (1 << (k - 1)); S ++)
upd(ans, dp[S][1][n]);
printf("%lld\n", ans);
return 0;
}
「BZOJ 4565」「HAOI 2016」字符合并「区间状压DP」的更多相关文章
- 「状压DP」「暴力搜索」排列perm
「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...
- 「BZOJ 5010」「FJOI 2017」矩阵填数「状压DP」
题意 你有一个\(h\times w\)的棋盘,你需要在每个格子里填\([1, m]\)中的某个整数,且满足\(n\)个矩形限制:矩形的最大值为某定值.求方案数\(\bmod 10^9+7\) \(h ...
- 「BZOJ 5161」最长上升子序列「状压DP」
题意 求一个\(1\sim n\)的排列LIS的期望长度,\(n\leq 28\) 题解 考虑朴素的LIS:\(f[i] = min(f[j]) + 1\) 记\(mx[i]\)为\(f\)的前缀最大 ...
- ☆ [POJ2411] Mondriaan's Dream 「状压DP」
传送门 >Here< 题意:用1*2的砖块铺满n*m的地板有几种方案 思路分析 状压经典题! 我们以$f[i][j]$作为状态,表示第i行之前全部填完并且第i行状态为j(状压)时的方案数. ...
- 「CF744C」Hongcow Buys a Deck of Cards「状压 DP」
题意 你有\(n\)个物品,物品和硬币有\(A\),\(B\)两种类型,假设你有\(M\)个\(A\)物品和\(N\)个\(B\)物品 每一轮你可以选择获得\(A, B\)硬币各\(1\)个,或者(硬 ...
- BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】
题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...
- BZOJ.4145.[AMPPZ2014]The Prices(状压DP)
BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f ...
随机推荐
- C - Co-prime
Given a number N, you are asked to count the number of integers between A and B inclusive which are ...
- hyper-v虚拟机centos7网络配置
原文地址:https://jingyan.baidu.com/article/91f5db1b0279bd1c7e05e377.html hyper-v安装了centos7之后并不能上网,这里简单介绍 ...
- 集成第三方框架,报错NoSuchFieldError:logger
logger项目中使用springboot的版本是2.0.1.RELEASE,该版本依赖的spring版本为5.0.5.RELEASE (logger在spring版本5.0.7.RELEASE中), ...
- 分布式session一致性问题
1.分布式session一致性 :指服务器集群情况下session共享的问题. 2.session的作用:保存服务器(tomcat)与客户端(浏览器)整个通讯的会话基本信息. 3.session应用场 ...
- MACD中短线交易系统
1.MA5.MA10金叉,且股价收盘站稳5日均线 2.MACD金叉 3.MACD红绿柱 a.MACD红柱发散,表示多头力量增强,此时买入或加仓 b.MACD红柱收缩,表示多头力量减弱,此时卖出或减仓 ...
- MySQL去除查询结果重复值
下面先来看看例子: table id name 1 a 2 b 3 c 4 c 5 b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多. 比如我想用一条语句查询得到name不重复 ...
- 微信小程序编译提示tabar.iconPath 文件不存在
tabBar.list[0].iconPath 文件不存在 明明是按路径放了本地图片的,却依然显示路径不存在 需要把路径的图片转移到编译后的weapp文件中相同路径下的img文件中 本地正常路径 粘贴 ...
- Spring之Redis访问(Spring-data-redis)
Spring-data-redis,是spring-data框架中,比较常用的,基于key-value键值对的数据持久层框架.Spring-data-redis,是一个基于Template模板开发的数 ...
- 我理解的epoll(一)——实现分析
epoll项目中用了几次,但是对于其原理只是一知半解.我希望通过几篇blog能加深对她的理解. 我认为epoll是同步IO,因为他在调用epoll_wait时,内核在有I/O就绪前是阻塞的,虽然可以将 ...
- HTML5学习:表格
HTML代码 <table> <thead> <tr> <th>标题1</th> <th>标题2</th> < ...