二刷提高课,题解目录在这里— 提高课的题解目录
此题虽然在斜率优化里但并未用到斜率优化因为数据只有5000所以使用的N^2求解
但是这里还是有一个核心点,若处理不好还是写不出
这里当我们进行分批的时候,可以发现每个分批时间点都会都后面产生影响(启动需要时间)
而我们所使用的的f进行状态计算时只能表示最小值并不能知道前面化了多少批
这就需要我们将后面所产生的影响将其加到前面去!(核心)
所以当以后遇到类似问题,某个操作对后面产生了影响(固定)
而我们又无法枚举出操作的个数,那么我们直接将后面的影响加在前面的计算中即可
#include<iostream>
#include<cstring>
using namespace std;
const int N=5e3+10;
int a[N],c[N];
long long sa[N],sc[N];
int n,s;
long long f[N];
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>c[i];
sa[i]=sa[i-1]+a[i];
sc[i]=sc[i-1]+c[i];
}
memset(f,0x3f,sizeof f);
f[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<i;j++)
{
f[i]=min(f[i],f[j]+sa[i]*(sc[i]-sc[j])+s*(sc[n]-sc[j]));
}
}
cout<<f[n];
return 0;
}