题目传送门

Description

有一个长度为 \(n\) 的 \(01\) 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数。

得到的新字符和分数由这 k 个字符确定。你需要求出你能获得的最大分数。

\(n\le 3\times 10^2,k\le 8\)

Solution

我们可以观察到的是,为了最优,我们要尽可量要合并的数不相交,因为这样可以合并尽可能多次。于是,也就是说,我们要最后k-1个数展开在原数组互不相交。

于是,我们可以设 \(f_{l,r,S}\) 表示区间 \([l,r]\) 合并成 \(S\) 的最大贡献。转移式显然,特殊情况就是刚好可以再合并一次。具体见代码。

Code

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define ll long long
#define MAXN 305 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} ll f[MAXN][MAXN][256];
int n,k,a[MAXN],c[MAXN],w[MAXN]; signed main(){
read (n,k);
for (Int i = 1;i <= n;++ i) read (a[i]);
for (Int i = 0;i < (1 << k);++ i) read (c[i],w[i]);
memset (f,0xcf,sizeof (f));
for (Int l = n;l >= 1;-- l)
for (Int r = l;r <= n;++ r){
if (l == r){f[l][r][a[l]] = 0;continue;}
int len = r - l;len %= k - 1;if (!len) len = k - 1;
for (Int mid = r;mid > l;mid -= k - 1)
for (Int S = 0;S < (1 << len);++ S)
f[l][r][S << 1] = max (f[l][r][S << 1],f[l][mid - 1][S] + f[mid][r][0]),
f[l][r][S << 1 | 1] = max (f[l][r][S << 1 | 1],f[l][mid - 1][S] + f[mid][r][1]);
if (len == k - 1){
ll g[2] = {-INT_MAX,-INT_MAX};
for (Int S = 0;S < (1 << k);++ S) g[c[S]] = max (g[c[S]],f[l][r][S] + w[S]);
f[l][r][0] = g[0],f[l][r][1] = g[1];
}
}
ll ans = 0;
for (Int S = 0;S < (1 << k);++ S) ans = max (ans,f[1][n][S]);
write (ans),putchar ('\n');
return 0;
}

题解 [HAOI2016]字符合并的更多相关文章

  1. 【BZOJ】4565: [Haoi2016]字符合并

    4565: [Haoi2016]字符合并 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 690  Solved: 316[Submit][Status ...

  2. [Haoi2016]字符合并 题解

    tijie 时间限制: 2 Sec  内存限制: 256 MB 题目描述 有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数.得到的新字 符和分数由这 ...

  3. BZOJ4565 [Haoi2016]字符合并

    题意 有一个长度为\(n\)的\(01\)串,你可以每次将相邻的\(k\)个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这\(k\)个字符确定.你需要求出你能获得的最大分数. \(n ...

  4. 【BZOJ4565】 [Haoi2016]字符合并

    Description 有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数.得到的新字 符和分数由这 k 个字符确定.你需要求出你能获得的最大分数. I ...

  5. BZOJ4565 HAOI2016字符合并(区间dp+状压dp)

    设f[i][j][k]为将i~j的字符最终合并成k的答案.转移时只考虑最后一个字符是由哪段后缀合成的.如果最后合成为一个字符特殊转移一下. 复杂度看起来是O(n32k),实际常数极小达到O(玄学). ...

  6. 2018.10.25 bzoj4565: [Haoi2016]字符合并(区间dp+状压)

    传送门 当看到那个k≤8k\le 8k≤8的时候就知道需要状压了. 状态定义:f[i][j][k]f[i][j][k]f[i][j][k]表示区间[i,j][i,j][i,j]处理完之后的状态为kkk ...

  7. [BZOJ4565][HAOI2016]字符合并(区间状压DP)

    https://blog.csdn.net/xyz32768/article/details/81591955 首先区间DP和状压DP是比较明显的,设f[L][R][S]为将[L,R]这一段独立操作最 ...

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

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

  9. [HAOI2016]字符合并

    Luogu3736 很容易想到直接DP,关键是枚举顺序. \(1.\)设后一段构成最后一个点,前一段构成前面的点,那么能得到\(1\)个点的数量要求 : \(1,k,2k-1...\)相差\(k-1\ ...

随机推荐

  1. ubuntu 设置简单密码

    ubuntu自带的修改密码界面要求比较长.比较复杂的密码.但通过命令行可以不受此限制. 用如下命令,按提示输入密码即可. sudo passwd username

  2. Learning ROS: Using a C++ class in Python

    http://wiki.ros.org/ROS/Tutorials/Using%20a%20C%2B%2B%20class%20in%20Python This tutorial illustrate ...

  3. 修改Windows7系统默认软件安装目录

    Windows7系统默认软件安装目录都在C盘Program Files文件夹有时候我们需要把软件安装到其他地方,如果每次安装的时候都要重新选择一次十分麻烦,下面Windows7之家教你修改软件默认安装 ...

  4. Jetpack Compose之隐藏Scaffold的BottomNavigation

    做主页导航时会用到底部导航栏,Jetpack Compose提供了基础槽位的布局Scaffold,使用Scaffold可以构建底部导航栏,例如: @Composable fun Greeting(vm ...

  5. JS_DOM操作之查找标签

    1 - 直接查找标签 // 方式1:获取元素 document.getElementsByTagName("标签名") document.getElementById(" ...

  6. Docker(40)- docker 实战三之安装 ES+Kibana

    背景 参考了狂神老师的 Docker 教程,非常棒! https://www.bilibili.com/video/BV1og4y1q7M4?p=16 es 前言 es 暴露的端口很多 es 十分耗内 ...

  7. DHCP 协议及其交互过程

    1. DHCP用途简介: DHCP服务应用于大型局域网络中,使网络中的主机自动获取IP地址,网关,DNS服务器等信息,能够提升IP地址的利用率.一般情况下,我们的家用.公司.公共场合使用的路由器都具有 ...

  8. vue+element+echarts柱状图+列表

    前端由vue+element搭建框架,引入vue和element的index.js和css就可以写页面: 页面和js可以echarts官网实例看下都是有的,主要看下如何动态赋值: 柱状图和列表: &l ...

  9. MySQL数据库初体验

    一.数据库的基本概念1.数据(Data) 描述事物的符号记录 包括数字,文字,图形,图像,声音,档案记录等 以"记录"形式按统一的格式进行存储 2.表 将不同的记录组织在一起 用来 ...

  10. Baidu初试题分享(Java高级工程师)

    [特别声明:文章仅用来借鉴学习,不用于其他商业化活动] 1.JDK和JRE区别? JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库.通过JDK开发人员将源 ...