rt,最有一个点wa了,调试半天不知错在哪里
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
struct node {
double x, y, v;
} a[maxn];
double dp[maxn][maxn][2], s[maxn];
bool cmp(node x, node y) {
return x.x < y.x;
}
double sum(int l, int r) {
return a[r].x - a[l].x;
}
void best_coder() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i].x;
}
for (int i = 1; i <= n; ++i) {
cin >> a[i].y;
}
for (int i = 1; i <= n; ++i) {
cin >> a[i].v;
}
a[++n].x = m;
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; ++i) {
s[i] = s[i - 1] + a[i].v;
}
memset(dp, -0x3f, sizeof(dp));
for (int i = 1; i <= n; ++i) {
if ((a[i].v == 0) && (a[i].x == m)) {
dp[i][i][1] = dp[i][i][0] = 0;
}
}
for (int i = 2; i <= n; ++i) {
for (int l = 1; l + i - 1 <= n; ++l) {
int r = l + i - 1;
double s0 = s[l] + s[n] - s[r];
double s1 = s[l - 1] + s[n] - s[r - 1];
dp[l][r][0] = a[l].y + max(dp[l + 1][r][0] - sum(l, l + 1) * s0, dp[l + 1][r][1] - sum(l, r) * s0);
dp[l][r][1] = a[r].y + max(dp[l][r - 1][1] - sum(r - 1, r) * s1, dp[l][r - 1][0] - (sum(l, r) * s1));
}
}
cout << fixed << setprecision(3) << max(dp[1][n][1], dp[1][n][0]) / 1000.0;
}
void happy_coder() {
}
int main() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// 小码匠
best_coder();
// 最优解
// happy_coder();
return 0;
}