BZOJ4565: [Haoi2016]字符合并
BZOJ4565: [Haoi2016]字符合并
区间Dp·状压Dp
题解:
又一道神题,蒟蒻orz
由于合并的获利为正,所以一定会合并到不能合并为止。我们发现一个长度lenlen合并完的长度是已知的,length[i]=(i<m?i:length[i−m+1])length[i]=(i
设f[i][j][s]f[i][j][s]表示区间[i,j][i,j]最后变成ss的最大获利。ss是一个length[j−i+1]length[j-i+1]位的二进制数。
枚举一个midmid,我们让右区间提供ss的最后一位,左区间提供剩下的。为了让右边恰好提供一位,我们实际上应该跳着枚举midmid.
那么不难写出方程:
f[i][j][s] = max( f[i][mid][s>>1]+f[mid+1][j][s\&1] )
注意,对于length=1length=1的,特殊处理一下,加上获利。可以先当length=mlength=m来算,然后g[c[s]]=max(f[i][j][s]+w[s])g[c[s]]=max(f[i][j][s]+w[s]).
边界就是f[i][i][a[i]]=1,f[i][i][a[i]xor1]=−INFf[i][i][a[i]]=1,f[i][i][a[i]xor1]=-INF
Code:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 305;
const LL INF = 1e17;int n,m;
int a[N],c[N],w[N],length[N];
LL f[N][N][N];int main(){freopen("a.in","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%1d",a+i);f[i][i][a[i]]=0; f[i][i][a[i]^1]=-INF;}for(int i=0;i<(1<<m);i++) scanf("%d%d",c+i,w+i);for(int i=1;i<m;i++) length[i]=i;for(int i=m;i<=n;i++) length[i]=length[i-m+1];for(int len=2;len<=n;len++){int full=(1<<(length[len]==1?m:length[len]))-1;for(int i=1,j=len;j<=n;i++,j++){for(int s=0;s<=full;s++){f[i][j][s]=-INF;for(int mid=j-1;mid>=i;mid-=m-1){f[i][j][s]=max(f[i][j][s],f[i][mid][s>>1]+f[mid+1][j][s&1]);}}if(length[len]==1){LL g[2]={-INF,-INF};for(int s=0;s<=full;s++){g[c[s]]=max(g[c[s]],f[i][j][s]+w[s]);}f[i][j][0]=g[0];f[i][j][1]=g[1];}}}int full=(1<<length[n])-1;LL ans=-INF;for(int s=0;s<=full;s++){ans=max(ans,f[1][n][s]);}printf("%lld\n",ans);
}
BZOJ4565: [Haoi2016]字符合并相关推荐
- [BZOJ4565][Haoi2016]字符合并(区间状压dp)
Address https://www.lydsy.com/JudgeOnline/problem.php?id=4565 Solution 区间合并让人想到区间 dp ,而 k≤8k≤8k\le8 ...
- bzoj4565 [HAOI2016]字符合并 结论+状压+区间dp
如果k==2的话就是记搜, 但这个题用记搜的思路的话是需要枚举k个断点的, 所以对于枚举断点,就很可能有优化,比如到一个断点,一个决策的最优值 于是考虑区间dp模型,相当于是插入一个数,然后看影响. ...
- [HAOI2016]字符合并(ing)
[HAOI2016]字符合并 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 有一个长度为 ...
- 【BZOJ 4565】 [Haoi2016]字符合并 区间dp+状压
考试的时候由于总是搞这道题导致爆零~~~~~(神™倒序难度.....) 考试的时候想着想着想用状压,但是觉得不行又想用区间dp,然而正解是状压着搞区间,这充分说明了一件事,状压不是只是一种dp而是一种 ...
- jexcel可以合并单元格么_含金量超高的3个文本、字符合并实用技巧解读!
当各位亲看到此篇文章时,说明已是2019年1月1日呢,感谢各位亲对小编的支持和厚爱,在这里祝福各位亲元旦快乐,"19"快乐,事业有成--同时,小编会继续努力为各位亲开发更多的实用技 ...
- Python 将字符串转换成单个字符;将单个字符合并成字符串
# 将字符串转换成单个字符: s = "kkjjasd" # 1 for i in s:print(i)# 2 k = list(s) print(k)# 3 g = set(s) ...
- mysql按指定长度拆分_MySQL按指定字符合并及拆分
按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符).本文将举例演示如何进行按照指定字符合并及拆分. 1. 合并 M ...
- 把两个字符合并成单个字符(0,a 合成0x0a)
最近弄一个项目过程中,因为串口数据传输时,协议要求把0x0a拆成2个字符0和a,换成十六进制就是0x30和0x41两个字符发送,但是数据包填充后要用CRC校验,CRC校验确又是用的原字符去校验,即把0 ...
- 每天一道LeetCode-----将字符串的连续相同的字符合并成一个字符后加个数
Count and Say 原题链接 Count and Say 求出第n个表达式,第n个表达式由第n-1个表达式的读音构成.如 第3个表达式为21,读作1个2,1个1,所以第4个表达式就是1211. ...
- excel字符合并技巧:几种连接字符串的方法助你高效办公
[前言] 在使用EXCEL的实际应用中,我们经常会为了统计方便,把数据元素分的相对详细一些,那么统计的维度也就会多一些.同样的,有的时候我们也需要把拆分的很详细的内容,再合并成一个内容放在一个单元格中 ...
最新文章
- 用了5年的Git,你竟然还不晓得它的实现原理!
- 不用FTP使用SecureCRT上传下载文件,并解决rz、sz command not found异常
- 关于 Orbeon form PE 版本使用 JavaScript Embedding API 的一个例子
- GWT的渐进式Web应用程序配方
- 计算机二级公共基础知识2020版电子版,2020年计算机二级考试公共基础知识背诵笔记...
- java编程有什么独特之处?
- 三十、详测 Generics Collections: TObjectList、TObjectQueue、TObjectStack
- 华三交换机配置access命令_H3C交换机配置命令大全
- 【LeetCode】【字符串】题号:*539. 最小时间差
- AP计算机从懵懵懂懂到突飞猛进-----加利福尼亚学生满分经验分享!
- python自然语言处理-广度优先搜索
- 【Android高级】查看手机及应用内存状况的方法
- SpringBoot有关数组对象转JSON
- 信号量哲学家问题java_利用AND信号量机制解决哲学家进餐问题
- unsigned long long 与 long long
- React+Redux技术栈核心要点解析(下篇)
- 微信公众平台-公众号相关api封装(java)
- 中兴通讯如何以5G技术实现数字化转型?
- python实例1-找质数/素数
- onlyoffice 源码编译,破解20连接数限制,并部署到centos7