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。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 struct job 7 { 8 int s,t,w; 9 bool operator < (const job &a) const 10 { 11 return t<a.t; 12 } 13 }; 14 15 job p[1010]; 16 int f[1010],dp[1010]; 17 18 void compute(int m,int r) 19 { 20 f[1]=0; 21 for(int i=2;i<=m;i++) 22 { 23 int k=i-1; 24 while(k>0&&p[k].t+r>p[i].s) 25 k--; 26 f[i]=k; 27 } 28 } 29 30 int main() 31 { 32 int n,m,r; 33 while(~scanf("%d%d%d",&n,&m,&r)) 34 { 35 for(int i=1;i<=m;i++) scanf("%d%d%d",&p[i].s,&p[i].t,&p[i].w); 36 sort(p+1,p+m+1); 37 compute(m,r); 38 memset(dp,0,sizeof(dp)); 39 for(int i=1;i<=m;i++) 40 dp[i]=max(dp[i-1],dp[f[i]]+p[i].w); 41 printf("%d ",dp[m]); 42 43 } 44 return 0; 45 }