P5985 [PA2019] Muzyka pop 题解
P5985 [PA2019] Muzyka pop 题解
是蛮有意思的一道题。
第一反应是设
于是区间 dp 的定义式便容易得出:
依据常见的套路,我们再定义
需要注意的是这样 dp 无法处理一位上只取一个数的情形。套路地,我们预处理
本题的关键是能将 最高的含
代码:
#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;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现