CSP-S 2024 T3 染色 题解
一道自认为特别好的 dp 题,虽然水,但是感觉很适合刚学 dp 的人做的一道题。
题目链接:https://www.luogu.com.cn/problem/P11233。
考虑 dfs 暴力,枚举每一个位置的颜色,记录当前位置上一个的红色和蓝色的数的值,在中途统计答案。时间复杂度:
考虑将 dfs 暴力转化为 dp,将 dfs 中记录的状态转化为
容易发现一个性质,我们没必要将
时间复杂度:
将第二个转移式拆分为两个:
对于这三个转移式,我们首先可以将
时间复杂度:
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 1e6 + 5;
int T, n, maxa, a[kMaxN];
long long f[kMaxN][2], ans, g[2], h[2];
int main() {
ios::sync_with_stdio(0), cin.tie(0);
for (cin >> T; T; T--, maxa = ans = 0) {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i], maxa = max(maxa, a[i]);
}
for (int i = 0; i <= maxa; i++) {
f[i][0] = f[i][1] = -1e18;
}
f[0][0] = f[0][1] = g[0] = g[1] = h[0] = h[1] = 0;
for (int i = 1; i <= n; i++) {
long long tmp[2] = {};
for (int o = 0; o < 2; o++) {
tmp[o] = max({f[a[i - 1]][o], g[o ^ 1] - a[i] * (a[i] == a[i - 1]), f[a[i]][o ^ 1] + a[i] - a[i] * (a[i] == a[i - 1])});
}
for (int o = 0; o < 2; o++) {
h[o] += a[i] * (a[i] == a[i - 1]), g[o] = max(g[o], f[a[i - 1]][o] = tmp[o]);
}
}
for (int i = 0; i <= maxa; i++) {
ans = max(ans, max(f[i][0] + h[0], f[i][1] + h[1]));
}
cout << ans << '\n';
}
return 0;
}
水题,但是考试上没有细想,以为题目太难,直接开始打 T4 暴力,如果仔细想一下的话,肯定是能够想出来的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!