洛谷 P2365 任务安排【dp】

其实是可以斜率优化的但是没啥必要
设st为花费时间的前缀和,sf为Fi的前缀和,f[i]为分组到i的最小花费
然后枚举j转移,考虑每次转移都是把j到i分为一组这样意味着j及之后的都要增加s的时间,同时增加这段的结束时间/*F,取min即可

#include<iostream>
#include<cstdio>
using namespace std;
const int N=5005,inf=1e9;
int n,s,st[N],sf[N],f[N];
int read()
{
	int r=0,f=1;
	char p=getchar();
	while(p>'9'||p<'0')
	{
		if(p=='-')
			f=-1;
		p=getchar();
	}
	while(p>='0'&&p<='9')
	{
		r=r*10+p-48;
		p=getchar();
	}
	return r*f;
}
int main()
{
	n=read(),s=read();
	for(int i=1;i<=n;i++)
		st[i]=st[i-1]+read(),sf[i]=sf[i-1]+read();
	for(int i=1;i<=n;i++)
		f[i]=inf;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++)
			f[i]=min(f[i],f[j-1]+s*(sf[n]-sf[j-1])+st[i]*(sf[i]-sf[j-1]));
	printf("%d\n",f[n]);
	return 0;
}
posted @ 2018-05-25 14:45  lokiii  阅读(266)  评论(0编辑  收藏  举报