洛谷P2466 [SDOI2008]Sue的小球 题解 区间DP+费用提前计算

题目链接:https://www.luogu.com.cn/problem/P2466

题目大意:略。

解题思路:

首先将 n 个彩蛋按照 x 从小到大排序。

然后定义状态 f[L][R][s],其含义为:

  • s=0 时:接完了第 [L,R] 范围内的所有彩蛋,且当前处在最左边的位置(L处),收获的得分+给未来造成的得分的损耗之和的最大值;
  • s=1 时:接完了第 [L,R] 范围内的所有彩蛋,且当前处在最右边的位置(R处),收获的得分+给未来造成的得分的损耗之和的最大值。

则状态转移方程为:

L=R 时,

f[L][R][s]=yL|x0xL|×1invi

L<R 时,

f[L][R][0]=max{f[L+1][R][0]+yL(iLvi+i>Rvi)×(xL+1xL),f[L+1][R][1]+yL(iLvi+i>Rvi)×(xRxL)}

f[L][R][1]=max{f[L][R1][0]+yR(i<Lvi+iRvi)×(xRxL),f[L][R1][1]+yR(i<Lvi+iRvi)×(xRxR1)}

实现代码如下:

#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;
}
posted @   quanjun  阅读(188)  评论(0编辑  收藏  举报
编辑推荐:
· 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训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示