[CSP-S 2024] 染色
前言#
很难蚌的一次考试, 很难确定是实力问题还是什么
算法#
事实上是可以看出是 dp 题的
令
令
#
当前位置产生贡献#
对于
对于
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
g[i][j] = g[i][j - 1];
if (a[j] == a[j - 1]) g[i][j] += a[j];
}
}
有
当前位置不产生贡献#
显然有
代码#
#include <bits/stdc++.h>
#define rint register int
using namespace std;
const int N = 2e3 + 5;
int n, T;
int a[N], lst[N];
int f[N], g[N][N], ans;
signed main()
{
cin >> T;
while (T--)
{
cin >> n;
memset(a, 0, sizeof a);
memset(lst, 0, sizeof lst);
memset(f, 0, sizeof f);
memset(g, 0, sizeof g);
for (rint i = 1; i <= n; i++) cin >> a[i];
for (rint i = 1; i <= n; i++)
{
for (rint j = i + 1; j <= n; j++)
{
g[i][j] = g[i][j - 1];
if (a[j] == a[j - 1]) g[i][j] += a[j];
}
}
for (rint i = 1; i <= n; i++)
{
if (lst[a[i]] == 0)
{
lst[a[i]] = i;
f[i] = f[i - 1];
} else
{
f[i] = max(f[i - 1], max(f[lst[a[i]] + 1], f[lst[a[i]]]) + a[i] + g[lst[a[i]] + 1][i - 1] );
lst[a[i]] = i;
}
}
cout << f[n] << endl;
}
return 0;
}
正解#
考虑优化
观察到
令
前缀和处理即可
正解代码#
略, 显然非常好实现
总结#
对于 dp 优化, 考虑建立辅助数组, 再想办法从辅助数组的特殊性质下手进行优化
这是一种常见的套路
分类:
题目总结 / dp / 普通dp
, 题目总结 / 套路题
vivo 50
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!