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]位的二进制数。

枚举一个mid​mid​,我们让右区间提供s​s​的最后一位,左区间提供剩下的。为了让右边恰好提供一位,我们实际上应该跳着枚举mid​mid​.

那么不难写出方程:

f[i][j][s]=max(f[i][mid][s>>1]+f[mid+1][j][s&amp;1])

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]字符合并相关推荐

  1. [BZOJ4565][Haoi2016]字符合并(区间状压dp)

    Address https://www.lydsy.com/JudgeOnline/problem.php?id=4565 Solution 区间合并让人想到区间 dp ,而 k≤8k≤8k\le8 ...

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

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

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

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

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

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

  5. jexcel可以合并单元格么_含金量超高的3个文本、字符合并实用技巧解读!

    当各位亲看到此篇文章时,说明已是2019年1月1日呢,感谢各位亲对小编的支持和厚爱,在这里祝福各位亲元旦快乐,"19"快乐,事业有成--同时,小编会继续努力为各位亲开发更多的实用技 ...

  6. Python 将字符串转换成单个字符;将单个字符合并成字符串

    # 将字符串转换成单个字符: s = "kkjjasd" # 1 for i in s:print(i)# 2 k = list(s) print(k)# 3 g = set(s) ...

  7. mysql按指定长度拆分_MySQL按指定字符合并及拆分

    按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符).本文将举例演示如何进行按照指定字符合并及拆分. 1. 合并 M ...

  8. 把两个字符合并成单个字符(0,a 合成0x0a)

    最近弄一个项目过程中,因为串口数据传输时,协议要求把0x0a拆成2个字符0和a,换成十六进制就是0x30和0x41两个字符发送,但是数据包填充后要用CRC校验,CRC校验确又是用的原字符去校验,即把0 ...

  9. 每天一道LeetCode-----将字符串的连续相同的字符合并成一个字符后加个数

    Count and Say 原题链接 Count and Say 求出第n个表达式,第n个表达式由第n-1个表达式的读音构成.如 第3个表达式为21,读作1个2,1个1,所以第4个表达式就是1211. ...

  10. excel字符合并技巧:几种连接字符串的方法助你高效办公

    [前言] 在使用EXCEL的实际应用中,我们经常会为了统计方便,把数据元素分的相对详细一些,那么统计的维度也就会多一些.同样的,有的时候我们也需要把拆分的很详细的内容,再合并成一个内容放在一个单元格中 ...

最新文章

  1. 用了5年的Git,你竟然还不晓得它的实现原理!
  2. 不用FTP使用SecureCRT上传下载文件,并解决rz、sz command not found异常
  3. 关于 Orbeon form PE 版本使用 JavaScript Embedding API 的一个例子
  4. GWT的渐进式Web应用程序配方
  5. 计算机二级公共基础知识2020版电子版,2020年计算机二级考试公共基础知识背诵笔记...
  6. java编程有什么独特之处?
  7. 三十、详测 Generics Collections: TObjectList、TObjectQueue、TObjectStack
  8. 华三交换机配置access命令_H3C交换机配置命令大全
  9. 【LeetCode】【字符串】题号:*539. 最小时间差
  10. AP计算机从懵懵懂懂到突飞猛进-----加利福尼亚学生满分经验分享!
  11. python自然语言处理-广度优先搜索
  12. 【Android高级】查看手机及应用内存状况的方法
  13. SpringBoot有关数组对象转JSON
  14. 信号量哲学家问题java_利用AND信号量机制解决哲学家进餐问题
  15. unsigned long long 与 long long
  16. React+Redux技术栈核心要点解析(下篇)
  17. 微信公众平台-公众号相关api封装(java)
  18. 中兴通讯如何以5G技术实现数字化转型?
  19. python实例1-找质数/素数
  20. onlyoffice 源码编译,破解20连接数限制,并部署到centos7

热门文章

  1. 并行计算(一):简介
  2. 怎么设置html禁止直接打开,如何禁止网页自动跳转
  3. windows的消息传递--消息盒子
  4. ubuntu16.04安装微软kinect V1驱动
  5. 用计算机画图教案评价,电脑画图教案
  6. 丘成桐女子中学生数学竞赛结果出炉,人大附中拿下金奖,上海4人入围
  7. Open vStorage —— 虚拟化的存储路由系统
  8. 组图:释放性感诱惑 内地超级豪放女星大盘点
  9. Bluefish 1.1.3
  10. Spring Security - 21 记住我功能