原题链接:https://vjudge.net/problem/UVA-1336
分类:区间DP
备注:记忆化搜索
注意一定要加floor,否则会WA。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1010;
struct Node {
double x, c, d;
bool operator < (const Node& rhs) const {
return x < rhs.x;
}
}p[N];
int n;
double x, v, sumD[N];
double d[N][N][2];
double t(int l, int r) {
return (p[r].x - p[l].x) / v;
}
double cost(int l, int r) {
return sumD[l - 1] + sumD[n] - sumD[r];
}
double dfs(int i, int j, int k) {
if (d[i][j][k] >= 0.0) return d[i][j][k];
if (i == j) {
if (p[i].x == x && p[i].c ==0 && p[i].d == 0) return d[i][j][k] = 0;
else return d[i][j][k] = 1e18;
}
d[i][j][k] = 1e18;
if (k == 0) {
d[i][j][k] = min(d[i][j][k], dfs(i + 1, j, 0) + cost(i + 1, j) * t(i, i + 1) + p[i].c);
d[i][j][k] = min(d[i][j][k], dfs(i + 1, j, 1) + cost(i + 1, j) * t(i, j) + p[i].c);
} else{
d[i][j][k] = min(d[i][j][k], dfs(i, j - 1, 0) + cost(i, j - 1) * t(i, j) + p[j].c);
d[i][j][k] = min(d[i][j][k], dfs(i, j - 1, 1) + cost(i, j - 1) * t(j - 1, j) + p[j].c);
}
return d[i][j][k];
}
int main(void) {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
while (~scanf("%d%lf%lf", &n, &v, &x) && n) {
for (int i = 1; i <= n; i++) {
scanf("%lf%lf%lf", &p[i].x, &p[i].c, &p[i].d);
}
n++;
p[n].x = x;
p[n].c = p[n].d = 0;
sort(p + 1, p + 1 + n);
for (int i = 1; i <= n; i++)
sumD[i] = sumD[i - 1] + p[i].d;
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
d[i][j][0] = d[i][j][1] = -1;
printf("%.lf\n", floor(min(dfs(1, n, 0), dfs(1, n, 1))));
}
return 0;
}