谁1700的题会写这么毒瘤啊/kk
#include <bits/stdc++.h>
#define int long long
#define maxn 1005
using namespace std;
int n, m, k, f[maxn][maxn], g[maxn][maxn];//g:last one which is not deleted
struct node {
int t, w;
}Q[maxn << 1];
signed main() {
scanf("%lld%lld%lld", &n, &m, &k);
for(int i = 1;i <= n;i++) scanf("%lld", &Q[i].t);
for(int i = 1;i <= n;i++) scanf("%lld", &Q[i].w);
Q[n + 1].t = m, Q[n + 1].w = 0;
int suf = 0;
for(int i = 1;i <= n;i++) {
suf += Q[i].w * (Q[i + 1].t - Q[i].t);
f[i][0] = suf;
g[i][0] = i;
for(int j = 1;j <= min(k, i - 1);j++) {
int pre = Q[i - 1].w * (Q[i + 1].t - Q[i - 1].t);
f[i][j] = 1e18;
for(int l = i - 1;l >= 1;l--) {
if(!f[l][j - (i - l - 1)]) break;
// if(i == 3 && j == 1) cout << f[l][j - (i - l - 1)] <<endl;
if(f[l][j - (i - l - 1)] + Q[g[l][j - (i - l - 1)]].w * (Q[i].t - Q[l + 1].t) + Q[i].w * (Q[i + 1].t - Q[i].t) < f[i][j]) {
f[i][j] = f[l][j - (i - l - 1)] + Q[g[l][j - (i - l - 1)]].w * (Q[i].t - Q[l + 1].t) + Q[i].w * (Q[i + 1].t - Q[i].t);
g[i][j] = i;
}
if(!(j - (i - l - 1))) break;
}
int lt = g[i - 1][j - 1];
if(f[i - 1][j - 1] + Q[lt].w * (Q[i + 1].t - Q[i].t) == f[i][j]) {
if(Q[lt].w < Q[g[i][j]].w) g[i][j] = lt;
}
if(f[i - 1][j - 1] + Q[lt].w * (Q[i + 1].t - Q[i].t) < f[i][j] || !f[i][j]) {
f[i][j] = f[i - 1][j - 1] + Q[lt].w * (Q[i + 1].t - Q[i].t);
g[i][j] = lt;
}
for(int l = i - 2;l >= 2;l--) {//force the one which attempt
if(!f[l][j - 1]) break;
if(f[l][j - 1] + pre < f[i][j]) {
f[i][j] = f[l][j - 1] + pre;
g[i][j] = i - 1;
}
else if(f[l][j - 1] + pre == f[i][j]) {
if(Q[i - 1].w < Q[g[i][j]].w) g[i][j] = i - 1;
}
pre += Q[l].w * (Q[l + 1].t - Q[l].t);
}
}
}
// for(int i = 1;i <= n;i++) {
// for(int j = 0;j <= i - 1;j++) {
// cout << f[i][j] << " ";
// }
// cout << endl;
// }
int ans = 1e18;
for(int i = 0;i <= k;i++) ans = min(ans, f[n][i]);
printf("%lld\n", ans);
}
第35个点, 也就是倒数第二个点WA了..