您的位置:首页 > 其它

BZOJ 1642: [Usaco2007 Nov]Milking Time 挤奶时间( dp )

2015-06-09 20:36 363 查看

水dp

先按开始时间排序 , 然后dp.

dp( i ) 表示前 i 个时间段选第 i 个时间段的最优答案 , 则 dp( i ) = max( dp( j ) ) + w_i ( 0 < j < i ) , answer = max( dp( i ) ) ( 1 <= i <= m )

-------------------------------------------------------------------------------------------

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define rep( i , n ) for( int i = 0 ; i < n ; ++i )#define clr( x , c ) memset( x , c , sizeof( x ) )using namespace std;const int maxn = 1000 + 5;int R;struct data { int l , r , w; void Read() { scanf( "%d%d%d" , &l , &r , &w ); r += R; } bool operator < ( const data &rhs ) const { return l < rhs.l; } };data A[ maxn ];int d[ maxn ];int main() { freopen( "test.in" , "r" , stdin ); int n , m; cin >> n >> m >> R; rep( i , m ) A[ i ].Read(); sort( A , A + m ); rep( i , m ) { d[ i ] = 0; data* o = &A[ i ]; rep( j , i ) { data &x = *( A + j ); if( x.r <= o -> l ) d[ i ] = max( d[ i ] , d[ j ] ); } d[ i ] += o -> w; } cout << *max_element( d , d + m ) << "\n"; return 0;}

-------------------------------------------------------------------------------------------

1642: [Usaco2007 Nov]Milking Time 挤奶时间

Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 609 Solved: 349
[Submit][Status][Discuss]

Description

贝茜是一只非常努力工作的奶牛,她总是专注于提高自己的产量。为了产更多的奶,她预计好了接下来的N (1 ≤ N ≤ 1,000,000)个小时,标记为0..N-1。 Farmer John 计划好了 M (1 ≤ M ≤ 1,000) 个可以挤奶的时间段。每个时间段有一个开始时间(0 ≤ 开始时间 ≤ N), 和一个结束时间 (开始时间 < 结束时间 ≤ N), 和一个产量 (1 ≤ 产量 ≤ 1,000,000) 表示可以从贝茜挤奶的数量。Farmer John 从分别从开始时间挤奶,到结束时间为止。每次挤奶必须使用整个时间段。 但即使是贝茜也有她的产量限制。每次挤奶以后,她必须休息 R (1 ≤ R ≤ N) 个小时才能下次挤奶。给定Farmer John 计划的时间段,请你算出在 N 个小时内,最大的挤奶的量。

Input

第1行三个整数N,M,R.接下来M行,每行三个整数Si,Ei,Pi.

Output

最大产奶量.

Sample Input

12 4 2
1 2 8
10 12 19
3 6 24
7 10 31

Sample Output

43

HINT

注意:结束时间不挤奶

Source

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