Description
Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤ 1,000,000) hours (conveniently labeled 0…N-1) so that she produces as much milk as possible.
Farmer John has a list of M (1 ≤ M ≤ 1,000) possibly overlapping intervals in which he is available for milking. Each interval i has a starting hour (0 ≤ starting_houri ≤ N), an ending hour (starting_houri < ending_houri ≤ N), and a corresponding efficiency (1 ≤ efficiencyi ≤ 1,000,000) which indicates how many gallons of milk that he can get out of Bessie in that interval. Farmer John starts and stops milking at the beginning of the starting hour and ending hour, respectively. When being milked, Bessie must be milked through an entire interval.
Even Bessie has her limitations, though. After being milked during any interval, she must rest R (1 ≤ R ≤ N) hours before she can start milking again. Given Farmer Johns list of intervals, determine the maximum amount of milk that Bessie can produce in the N hours.
Input
- Line 1: Three space-separated integers: N, M, and R
- Lines 2…M+1: Line i+1 describes FJ’s ith milking interval withthree space-separated integers: starting_houri , ending_houri , and efficiencyi
Output
- Line 1: The maximum number of gallons of milk that Bessie can product in the N hours
Sample Input
12 4 2
1 2 8
10 12 19
3 6 24
7 10 31
Sample Output
43
题意
农夫给奶牛挤奶,每次挤奶结束后,奶牛都要休息一会
给你挤奶开始的时间和结束的时间以及每次挤奶获得的val
问奶牛最多能产出多少val
分析
首先按开始时间递增的顺序进行排序然后进行判断休息后的时间是否能够接上下一次挤奶的开始时间
即第 i 次结束时间加上休息时间是否可以进行第 j 次,可以的话进行状态转移
当前状态 =当前状态与第 j 次获得的 val 和 上一状态挤奶获得的val 之和中最优的一个
状态转移方程:
dp[j] = max(dp[j] , milk[j].val + dp[i])
Code
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
struct node
{
int begin;
int end;
int val;
}milk[maxn];
int dp[maxn];//每个bg-ed可以获取的最优val
bool cmp(node a,node b)
{
return a.begin == b.begin?a.end < b.end:a.begin < b.begin;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
memset(dp,0,sizeof(dp));
int n,m,k;
cin>>n>>m>>k;
for(int i = 1 ; i <= m ; i++)
{
cin>>milk[i].begin>>milk[i].end>>milk[i].val;
}
sort(milk+1,milk+1+m,cmp);
for(int i = 1 ; i <= m ; i++)
{
dp[i] = milk[i].val;//初始化dp[i]的状态
}
int ans = -INT_MAX;
for(int i = 1 ; i <= m ; i++)//第一组
{
for(int j = 1 ; j <= m ; j++)//枚举第二组
{
if(milk[i].end + k <= milk[j].begin)//结束时间+休息时间<=第二组开始的时间说明可以挤奶
{
dp[j] = max(dp[j],milk[j].val + dp[i]);//状态转移
}
ans = max(dp[j],ans);//每次记录最优
}
}
cout<<ans<<endl;
return 0;
}