题目传送门

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. jQuery mobile网格布局

    3.4 内容格式化 jQuery Mobile中提供了许多非常有用的工具与组件,如多列的网格布局.折叠形的面板控制等,这些组件可以帮助开发者快速实现正文区域内容的格式化. 3.4.1 网格布局 jQu ...

  2. Notepad++插件推荐和下载

    Notepad++因为其强劲的插件支持,越来越受到编程爱好者的喜欢.很多优秀的插件现在已经默认安装了,下面是100多款受欢迎的Notepad++插件的介绍和下载地址. XML Tools 这个插件是包 ...

  3. 详解 Apache SkyWalking 跨进程传播协议

    简介 SkyWalking 跨进程传播协议是用于上下文的传播,本文介绍的版本是3.0,也被称为为sw8协议. Header项 Header应该是上下文传播的最低要求. Header名称:sw8. He ...

  4. Docker | 入门 & 基础操作

    Dcoker 入门 确保docker 已经安装好了,如没有装好的可以参考:Docker | 安装 运行第一个容器 docker run -it ubuntu /bin/bash docker run ...

  5. 【良心保姆级教程】java手把手教你用swing写一个学生的增删改查模块

    很多刚入门的同学,不清楚如何用java.swing去开发出一个系统? 不清楚如何使用java代码去操作数据库进行增删改查一些列操作,不清楚java代码和数据库(mysql.sqlserver)之间怎么 ...

  6. SpringApplication启动-图解

  7. SQL Server Management Studio --- SSMS语言更换

    问题描述 在安装了En版后,想更换为中文版,但换了中文安装源还是英文. 解决方法 运行 SQL Server Management Studio 通过菜单选择你想要使用的语言: 中文版:"工 ...

  8. "指针"和"引用"大对比

    相同点: 都能够直接引用对象,并对对象进行操作. 不同点: 指针 引用 指针类型的变量能够保存一个对象的地址 引用是一个对象的别名 可以为空nil,可以不初始化 不可以为空nil,必须初始化 当设计一 ...

  9. java原码反码补码以及位运算

    原码, 反码, 补码的基础概念和计算方法. 对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即 ...

  10. 【OI】WERTYU UVa 10082

    题目: A common typing error is to place the hands on the keyboard one row to the right of the correct ...