您的位置:首页 > 其它

poj-3616 Milking Time (区间dp)

2015-04-21 09:42 435 查看
http://poj.org/problem?id=3616

bessie是一头工作很努力的奶牛,她很关心自己的产奶量,所以在她安排接下来的n个小时以尽可能提高自己的产奶量。

现在有m个产奶时间,每个都有一个开始时间和结束时间和这个时间内的产奶量,任意一个时间段产奶之后,bessie都要休息r个时间,问如果安排产奶才能得到最大值。

注意这里m个时间其实都安排在n时间内,所以n其实是没用的。

设dp[i]是前i个时间内最多的产奶量 dp[i]=max(dp[i-1],dp[p[i]]+w[i]);

p[i]是与dp[i]最大不相容区间的下标。

预处理出p[i],然后dp。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct job
{
int s,t,w;
bool operator < (const job &a) const
{
return t<a.t;
}
};

job p[1010];
int f[1010],dp[1010];

void compute(int m,int r)
{
f[1]=0;
for(int i=2;i<=m;i++)
{
int k=i-1;
while(k>0&&p[k].t+r>p[i].s)
k--;
f[i]=k;
}
}

int main()
{
int n,m,r;
while(~scanf("%d%d%d",&n,&m,&r))
{
for(int i=1;i<=m;i++) scanf("%d%d%d",&p[i].s,&p[i].t,&p[i].w);
sort(p+1,p+m+1);
compute(m,r);
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
dp[i]=max(dp[i-1],dp[f[i]]+p[i].w);
printf("%d\n",dp[m]);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: