洛谷P2466 [SDOI2008]Sue的小球 题解 区间DP+费用提前计算
题目链接:https://www.luogu.com.cn/problem/P2466
题目大意:略。
解题思路:
首先将 个彩蛋按照 从小到大排序。
然后定义状态 ,其含义为:
- 当 时:接完了第 范围内的所有彩蛋,且当前处在最左边的位置(处),收获的得分+给未来造成的得分的损耗之和的最大值;
- 当 时:接完了第 范围内的所有彩蛋,且当前处在最右边的位置(处),收获的得分+给未来造成的得分的损耗之和的最大值。
则状态转移方程为:
当 时,
当 时,
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct Node {
int x, y, v;
Node() {};
Node(int _x, int _y, int _v) { x = _x; y = _y; v = _v; }
} a[maxn];
bool cmp(Node a, Node b) {
return a.x < b.x;
}
int n, x0;
long long f[maxn][maxn][2], sumv[maxn];
bool vis[maxn][maxn][2];
long long dfs(int L, int R, int s) {
if (L == R) {
return a[L].y - abs(x0 - a[L].x) * sumv[n];
}
if (vis[L][R][s]) return f[L][R][s];
vis[L][R][s] = true;
if (s == 0) {
long long tmp1 = dfs(L+1, R, 0) + a[L].y - (sumv[L] + sumv[n] - sumv[R]) * (a[L+1].x - a[L].x);
long long tmp2 = dfs(L+1, R, 1) + a[L].y - (sumv[L] + sumv[n] - sumv[R]) * (a[R].x - a[L].x);
return f[L][R][0] = max(tmp1, tmp2);
}
else { // s == 1
long long tmp1 = dfs(L, R-1, 0) + a[R].y - (sumv[L-1] + sumv[n] - sumv[R-1]) * (a[R].x - a[L].x);
long long tmp2 = dfs(L, R-1, 1) + a[R].y - (sumv[L-1] + sumv[n] - sumv[R-1]) * (a[R].x - a[R-1].x);
return f[L][R][1] = max(tmp1, tmp2);
}
}
int main() {
scanf("%d%d", &n, &x0);
for (int i = 1; i <= n; i ++) scanf("%d", &a[i].x);
for (int i = 1; i <= n; i ++) scanf("%d", &a[i].y);
for (int i = 1; i <= n; i ++) scanf("%d", &a[i].v);
sort(a+1, a+1+n, cmp);
for (int i = 1; i <= n; i ++) sumv[i] = sumv[i-1] + a[i].v;
printf("%.3lf\n", (double) max(dfs(1, n, 0), dfs(1, n, 1))/ 1000.0);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人