首页 > 其他分享 >P5985 [PA2019] Muzyka pop 题解

P5985 [PA2019] Muzyka pop 题解

时间:2024-09-13 21:04:13浏览次数:1  
标签:le int 题解 sum pop Muzyka 最高 最大值 dp

P5985 [PA2019] Muzyka pop 题解

是蛮有意思的一道题。

\(n\le 200\),第一感觉是区间 dp,但是又不好设出状态。考虑 \(b\) 单调递增的过程中的性质,考虑后得到 \(b\) 的最高含 \(1\) 的位一定是单调不降的,于是我们考虑将最高的含 \(1\) 的位设入状态。

第一反应是设 \(f_{i,j}\) 表示选了前 \(i\) 个 \(a\),最高位 \(\le j\) 的最大值。设 \(s(l,r,i)\) 表示 \([l,r]\) 区间最高位都是 \(i\) 的方案数,则 \(f_{i,j}=\max\{f_{k,j-1}+s(k+1,i,j)\}\)。考虑 \(s(l,r,i)\) 的含义是确定了最高位,其它位不关心,于是 \(s(l,r,i)\) 实际上是 \([l,r]\) 区间最高位 \(\le j\) 的最大值 \(+\sum_{l}^r a_i\)。

于是区间 dp 的定义式便容易得出:\(f_{i,l,r}\) 表示最高位 \(\le i\),选择 \([l,r]\) 的最大值。转移的式子是 \(f_{i,l,r}=\max\{f_{i-1,l,k}+f_{i-1,k+1,r}+\sum_{l}^r a_i \}\)。现在考虑加上 \(m\) 限制的情况。

依据常见的套路,我们再定义 \(g_{i,l,r}\) 表示最高位的赋值和 \(m\) 在这一位上的取值相同时的最大值。那么当 \(m\) 这一位为 \(0\) 时,\(g_{i,l,r}=g_{i-1,l,r}\)。否则 \(g_{i,l,r}=\max\{f_{i-1,l,k}+g_{i-1,k+1,r}+\sum_l^r a_i \}\)。

需要注意的是这样 dp 无法处理一位上只取一个数的情形。套路地,我们预处理 \(f_{0,i,i-1}=g_{0,i,i-1}=0\),然后将 \(k\) 的范围改为枚举 \(k\in[l-1,r]\) 即可。

本题的关键是能将 最高的含 \(1\) 的位 设入状态,得出区间 dp 的套路,并得出 \(g\) 的转移定义。

代码:

#include <bits/stdc++.h>
#define int long long
#define N 205
using namespace std;
int n, m;
int a[N], sum[N];
int f[66][N][N], g[66][N][N];
signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		scanf("%lld", &a[i]), sum[i] = sum[i - 1] + a[i];
	memset(f, -0x3f, sizeof f);
	memset(g, -0x3f, sizeof g);
	for (int i = 1; i <= n; i++) 
		f[0][i][i] = g[0][i][i] = 0;	
	int M = ceil(log2(m)) + 1;
	for (int i = 0; i <= M; i++)
		for (int j = 1; j <= n + 1; j++)
			f[i][j][j - 1] = g[i][j][j - 1] = 0;
	for (int i = 1; i <= M; i++)
		for (int l = 1; l <= n; l++)
			for (int r = l; r <= n; r++) {
				for (int k = l - 1; k <= r; k++)
					f[i][l][r] = max(f[i][l][r], f[i - 1][l][k] + f[i - 1][k + 1][r] + sum[r] - sum[k]);
				g[i][l][r] = max(g[i][l][r], g[i - 1][l][r]);
				if (!((m >> (i - 1)) & 1))
					continue;
				for (int k = l - 1; k <= r; k++)
					g[i][l][r] = max(g[i][l][r], f[i - 1][l][k] + g[i - 1][k + 1][r] + sum[r] - sum[k]);
			}
	cout << g[M][1][n] << "\n";
	return 0;
} 

标签:le,int,题解,sum,pop,Muzyka,最高,最大值,dp
From: https://www.cnblogs.com/Rock-N-Roll/p/18412859

相关文章

  • 力扣494-目标和(Java详细题解)
    题目链接:494.目标和-力扣(LeetCode)前情提要:因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。如果大家感兴趣,......
  • 《Civilization: Beyond Earth》启动失败?《文明太空》msvcr110.dll问题解决方案大放送
    当您在尝试启动《文明:太空》(Civilization:BeyondEarth)时遇到“找不到msvcr110.dll”或“msvcr110.dll缺失”的错误提示,这意味着您的计算机上缺少或损坏了MicrosoftVisualC++2012运行时库中的一个关键组件。msvcr110.dll是许多基于C++开发的游戏和应用程序正常运行所必需的......
  • Thinkpad C13 Yoga Linux声卡驱动问题解决方案等
    ChromebookMorphius:ThinkpadC13Yoga与linux这本子做工真不错,全铝触摸屏,360翻折,还有usi笔槽。续航也很长,能连续用8个小时。安装linuxcoolstar.org,请。如果运行那个脚本有困难(网络问题),你可以尝试打开那个脚本看看biosrom是从哪里下载的。手动下载后用脚本里的flashrom那......
  • 【洛谷 P5266】【深基17.例6】学籍管理 题解(映射+分支)
    【深基17.例6】学籍管理题目描述您要设计一个学籍管理系统,最开始学籍数据是空的,然后该系统能够支持下面的操作(不超过条):插入与修改,格式1NAMESCORE:在系统中插入姓名为NAME(由字母和数字组成不超过20个字符的字符串,区分大小写),分数为()的学生。如果已经有同名的学生则更新这名......
  • [EGOI2024] Infinite Race题解
    [EGOI2024]InfiniteRace妙妙题。我们设\(cnt[x]\)表示当Anika和第\(x\)位选手相遇时Anika至少几次经过终点线。设定初始状态\(cnt[x]=-1\)表示两种等价的情况:Anika还未和第\(x\)位选手相遇过Anika被第\(x\)位选手超越了因此只剩下Anika超越了第\(x\)位选手......
  • 洛谷P8208 [THUPC2022 初赛] 骰子旅行 题解 期望DP
    题目链接:https://www.luogu.com.cn/problem/P8208解题思路:定义\(d_u\)表示节点\(u\)的出度,定义\(V_u\)表示节点\(u\)一步能够走到的节点的集合。定义状态\(p_{u,c,v}\)表示从节点\(u\)出发走恰好\(c\)步的情况下,至少经过一次节点\(v\)的概率。则:若\(v=......
  • 题解 P4827【[国家集训队] Crash 的文明世界】
    从阶乘幂到斯特林数-caijianhong-博客园(cnblogs.com)题目描述Crash小朋友最近迷上了一款游戏——文明5(CivilizationV)。在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家。现在Crash已经拥有了一个\(n\)个城市的国家,这......
  • 题解:CF1767E Algebra Flash
    可以在cnblogs中阅读。\(m\le40\)的数据范围提示让我们往颜色种类上考虑。由题每次可以跳\(1\)或\(2\)格,即存在一条从\(1\)到\(n\)的路径的充要条件是不存在两个相邻的未激活格。换句话说,对任意两个相邻的格子都必须选择至少一个激活。任意两个,至少一个,这样的条件......
  • 洛谷P10504 守卫者的挑战 题解 概率DP
    题目链接:https://www.luogu.com.cn/problem/P10504状态\(f_{i,s,k}\)表示:当前正面临第\(i\)项挑战(此时第\(1\simi-1\)项挑战已完成,第\(i\)项挑战还没开始);目前已经挑战成功了\(s\)项(即第\(1\simi-1\)项挑战中共有\(s\)项挑战成功,\((i-1)-s\)项没挑战成功);......
  • [ARC101E] Ribbons on Tree 题解
    [ARC101E]RibbonsonTree题解其实算一道好题了。首先考虑不相关的simple的dp。平凡的想法是设\(dp_{i,j}\)表示\(i\)子树内有\(j\)个点还需要向上转移的方案数。转移式大概是个\(dp_{x,i+j}=dp_{y,i+j-1}+(dp_{p,i-1}+dp_{q,j-1})\)之类的东西。这样的dp是\(O(......