考试的时候由于总是搞这道题导致爆零~~~~~(神™倒序难度.....)

考试的时候想着想着想用状压,但是觉得不行又想用区间dp,然而正解是状压着搞区间,这充分说明了一件事,状压不是只是一种dp而是一种用用二进制表示状态的方法,之前打的状压dp只不过是在线性dp的时候用了这种方法。

我们发现对于一个固定长度的区间他最后缩成的位数是一定的(且属于1~k-1),而且最后的每一位的数字的来源相互独立因为他们分别完全展开之后无交。那么我们按照区间dp的一般思路,扩展长度转移状态,我们将转移来源分为两部分,设mid为中间点,mid左边贡献1位,mid右边贡献其他位,那么就可以转移了。

对于len∈[2,k-1],我们 f[i][j][s]=max(f[i][mid][s>>1],f[mid+1][j][s&1]),(f[i][j][s]在[i,j]区间上最后状态为s的最大收益)

对于len==1,我们知道出来长度为1时他的1都是缩出来的因此我们要先处理在这里(1<<k)的状态最后根据c和w再转移

注意枚举顺序!!!

#include <cstdio>
typedef long long LL;
const int MAXN=310;
LL f[MAXN][MAXN][MAXN];
int n,k,full;
int len[MAXN];
int a[MAXN],c[MAXN],w[MAXN];
const LL Inf=2305843009213693952LL;
inline LL Max(LL x,LL y){return x>y?x:y;
}
int main(){scanf("%d%d",&n,&k);for(int i=1;i<k;i++)len[i]=i;for(int i=k;i<=n;i++)len[i]=len[i-k+1];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<<k);i++)scanf("%d%d",&c[i],&w[i]);for(int l=2;l<=n;l++){full=(1<<(len[l]==1?k:len[l]));for(int i=1,r=l;r<=n;i++,r++){for(int j=0;j<full;j++){f[i][r][j]=-Inf;for(int mid=r-1;mid>=i;mid-=k-1)f[i][r][j]=Max(f[i][r][j],f[i][mid][j>>1]+f[mid+1][r][j&1]);}if(len[l]==1){LL g[2]={0,0};for(int j=0;j<full;j++)g[c[j]]=Max(g[c[j]],f[i][r][j]+w[j]);f[i][r][1]=g[1];f[i][r][0]=g[0];}}}full=(1<<len[n]);LL ans=-Inf;for(int i=0;i<full;i++)ans=Max(ans,f[1][n][i]);printf("%lld",ans);
}

转载于:https://www.cnblogs.com/TSHugh/p/7367750.html

【BZOJ 4565】 [Haoi2016]字符合并 区间dp+状压相关推荐

  1. BZOJ 1226: [SDOI2009]学校食堂Dining [DP 状压]

    题意: $n$个人排队打饭,第$i$个人口味$a_i$,能容忍最多身后第$b_i$个人先打饭. 先后两人$i,j$做饭时间为$a_i & a_j - a_i | a_j$ 求最少时间 一开始想 ...

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

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

  3. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

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

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

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

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

  6. BZOJ.1032.[JSOI2007]祖码(区间DP)

    题目链接 BZOJ 洛谷 AC代码: 区间DP,f[i][j]表示消掉i~j需要的最少珠子数. 先把相邻的相同颜色的珠子合并起来. 枚举方法一样,处理一下端点可以碰撞消除的情况就行. 当然合并会出现问 ...

  7. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

  8. AcWing.282石子合并(区间DP)题解

    石子合并 题目描述 设有N堆石子排成一排,其编号为1,2,3,-,N. 每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆. 每次只能合并相邻的两堆,合并的代价为这两堆石子的质 ...

  9. bzoj 4006 管道连接 —— 斯坦纳树+状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...

最新文章

  1. 计算机二级python基础知识总结-计算机二级python 知识点篇(程序的控制结构)...
  2. java序列化和反序列化以及序列化ID的作用分析
  3. Python中元组的介绍以及常见操作
  4. Shell openSomething - how is application component loaded in the runtime
  5. Oracle 20c 新特性:持久化内存数据库 - Persistent Memory Database
  6. 完全使用CSS制作下拉菜单
  7. 单证票据识别之关键信息提取
  8. 概率论与数理统计(一)—— 联合概率、条件概率与边缘概率
  9. 解决php保存文件时文件名乱码问题
  10. Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结
  11. php爬虫框架phpfetcher,TrackRay:打造一款自己的渗透测试框架
  12. linux 不工作,Ubuntu用户Steam控制器不工作解决办法
  13. 我的世界java版幻翼_见到幻翼的方式是熬夜?这几个被忽略了
  14. 数据库中第一范式、第二范式、第三范式
  15. 《操作系统导论》吐血万字整理 - 附下载地址及思维导图
  16. system 权限读取注册表HKEY_CURRENT_USER
  17. 日语流行口语极短句2
  18. linux--redis(redis在lnmp中做加速器2)
  19. my_RIO实现小车避障
  20. matlab毕达哥拉斯质数,“毕达哥拉斯-史仲夏”常用勾股数组表

热门文章

  1. 动态规划解决方案最长公共子序列问题(开启)
  2. 回答跨专业考研者的几点疑问(计算机考研)
  3. java 流 下载文件_java 流实现文件下载问题
  4. JESD204B概述
  5. c语言中很多中括号由外向里,浅谈C语言中的类型声明
  6. 将声音转为图片(二维矩阵)
  7. 安装librosa遇到LLVM问题原因是numba问题
  8. Joomla 2.5 中文语言包安装模板报错
  9. 用 Python 实现打飞机,让子弹飞吧!
  10. 强大的Vivado IP工具——自定义IP的使用