ABC 285 E
题面
在某个世界里,一周有 天。
有一个工厂,为了最大化工人的产出,决定合理安排工作日和休息日。
他们根据统计,发现:
对于每个工作日,如果最近的一个休息日距离他有 天,则产出为 ;
对于每个休息日,产出为 0。
问一周的最大产出。
思路
dp!dp!dp!
设 为前 天的最大总产出(第 天是假期),那么我们遍历 ,
设 为假期与假期间的长度,则可得转移方程 ,其中 表示长度 的一段的总产出。
函数可以直接用前缀和求。
那么就完了。
代码
// Problem: E - Work or Rest
// Contest: AtCoder - AtCoder Beginner Contest 285
// URL: https://atcoder.jp/contests/abc285/tasks/abc285_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
long long a[10005];
long long pre[10005];
long long f[10005];
long long calc(long long len) {
if (len & 1) {
return pre[len / 2] + pre[len / 2 + 1];
} else {
return pre[len / 2] + pre[len / 2];
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
pre[i] = pre[i - 1] + a[i];
a[i + n] = a[i];
}
for (int i = n + 1; i <= 2 * n; i++) {
pre[i] = pre[i - 1] + a[i];
}
long long ans = -0x3f3f3f3f3f3f3f3fll;
for (int i = 2; i <= n; i++) {
f[i] = -0x3f3f3f3f3f3f3f3fll;
for (int j = 0; j < i; j++) {
f[i] = max(f[i], f[i - j - 1] + calc(j));
}
}
printf("%lld", f[n]);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统