$\huge \color{orange}{成魔之路->}$ $\huge \color{purple}{算法提高课题解}$
思路:
1. f[i] 表示从前 i 个里面选的费用系数 * 结束时刻 + 启动时间 s 对后面的产生的费用的最小值
2. 当前这批物品(从 j + 1 开始)的启动时间s对后面产生的影响 s * (sc[n] - sc[j])
3. [j + 1, i]状态转移:f[i] = min{f[j] + st[i] * (sc[i] - sc[j]) + s * (sc[n] - sc[j])}
完整代码 $O(n^2)$
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 5010;
int n,s;
int st[N],sc[N];
LL f[N];
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)
{
cin>>st[i]>>sc[i];
st[i]+=st[i-1]; //时间前缀和
sc[i]+=sc[i-1]; //费用前缀和
}
memset(f,0x3f,sizeof f);
f[0]=0;
for(int i=1;i<=n;i++) //这批物品到 i 结束
for(int j=0;j<i;j++) //上批物品到 j 结束
f[i]=min(f[i],f[j]+(LL)st[i]*(sc[i]-sc[j])+(LL)s*(sc[n]-sc[j]));
cout<<f[n]<<endl;
return 0;
}