1、B站视频链接:E52 斜率优化DP [SDOI2012]任务安排_哔哩哔哩_bilibili
题目链接:任务安排 - 洛谷
cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5010;
int n,s,q[N];
LL tim[N],c[N],f[N];
double slope(int i,int j){
return 1.0*(f[i]-f[j])
/(c[i]==c[j]?1e-9:c[i]-c[j]);
}
int main(){
scanf("%d%d",&n,&s);
for(int i=1;i<=n;i++){
scanf("%d%d",tim+i,c+i);
tim[i]+=tim[i-1]; c[i]+=c[i-1];
}
int h=1,t=0;
for(int i=1;i<=n;i++){
while(h<t && slope(i-1,q[t])<=slope(q[t],q[t-1]))t--;
q[++t]=i-1;
while(h<t && slope(q[h+1],q[h])<=tim[i]+s) h++;
int j=q[h];
f[i]=f[j]+tim[i]*(c[i]-c[j])+s*(c[n]-c[j]);
}
printf("%lld\n",f[n]);
}