ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解 [HAOI2016]字符合并

2021-02-01 21:35:39  阅读:155  来源: 互联网

标签:字符 read 题解 void 合并 Int HAOI2016 MAXN define


题目传送门

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;
}

标签:字符,read,题解,void,合并,Int,HAOI2016,MAXN,define
来源: https://www.cnblogs.com/Dark-Romance/p/14359122.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有