Rt,本来想先写个朴素的方法来验证推的式子对不对,但是Hack数据没有TLE,而是WA了,请大佬看一下是不是我的方程推错了,感激不尽~
#include <cstdio>
#include <iostream>
#define int long long
using namespace std;
const int maxn = 1e6 + 1;
const int inf = 9223372036854775807ll;
int n, k = 1, dp[maxn], sum1[maxn], sum2[maxn];
struct node{
int x, p, c;
}a[maxn];
signed main(){
a[0].x = 0;
a[0].p = 0;
a[0].c = 0;
scanf("%lld", &n);
for (int i = 1; i <= n; i++){
scanf("%lld%lld%lld", &a[i].x, &a[i].p, &a[i].c);
sum1[i] = sum1[i - 1] + a[i].p;
sum2[i] = sum2[i - 1] + sum1[i - 1] * (a[i].x - a[i - 1].x);
dp[i] = inf;
}
for (int i = 1; i <= n; i++){
for (int j = k; j <= i; j++){
if (dp[j - 1] + a[i].c + sum2[i] - sum2[j - 1] - sum1[j - 1] * (a[i].x - a[j - 1].x) <= dp[i]){
dp[i] = dp[j - 1] + a[i].c + sum2[i] - sum2[j - 1] - sum1[j - 1] * (a[i].x - a[j - 1].x);
k = j;
}
}
}
printf("%lld", dp[n]);
return 0;
}