ECNUOJ 2615 会议安排

会议安排

Time Limit:1000MS Memory Limit:65536KB
Total Submit:451 Accepted:102

Description

科研人员与相关领域的国内外同行进行适时的接触与充分的交流,对于促进提高他们的科研业务水平,并及时掌握科研动态是十分必要而且重要的。ECNU为了走在科技的前沿,于是决定派遣一些学者出去参加会议。由于这些会议具有不同的级别,因此对于科研人员可能带来的科研上的促进作用也就可能不同。但是一个学者不能同时参加两个会议。而且,如果一个学者需要连续参加两个会议,第二个会议的开始时间要晚于第一个会议的结束时间..
现在给出一些会议的起始时间和终止时间,并给出这些会议对应的促进值,请你计算出一个学者能够得到的最大的促进值。

Input

第一行为一个整数T,表示测数数据的组数.
每组数据第一行为整数n(1<=n<=300),代表有n个会议,然后有n行数据,每行给出3个整数s(会议开始时间),t(会议终止时间),w(会议相对应的促进作用).(0<=s<=t<=365,0<w<100)

Output

输出能够得到的最大的促进作用。
每组测试数据输出占一行。

Sample Input

2
3
2 5 5
4 6 4
6 7 10
3
1 2 3
2 4 10
3 10 2

Sample Output

15
10

Source

华东师范大学2009校赛

解题:直接dp好啦,dp[j]表示在j时间内,能够获得最大的促进作用是多少,然后类似于01背包,一顿瞎搞

ECNUOJ 2615 会议安排
 1 #include <bits/stdc++.h>

 2 using namespace std;

 3 const int maxn = 1000;

 4 int dp[maxn];

 5 struct node{

 6     int s,t,w;

 7     bool operator<(const node &o) const{

 8         return t < o.t;

 9     }

10 }m[maxn];

11 int main(){

12     int kase,n;

13     scanf("%d",&kase);

14     while(kase--){

15         scanf("%d",&n);

16         for(int i = 0; i < n; ++i){

17             scanf("%d %d %d",&m[i].s,&m[i].t,&m[i].w);

18         }

19         sort(m,m+n);

20         memset(dp,0,sizeof dp);

21         for(int i = 0; i < n; ++i){

22             for(int j = m[n-1].t; j >= 0; --j){

23                 if(j >= m[i].t) dp[j] = max(dp[j],dp[m[i].s - 1] + m[i].w);

24             }

25         }

26         cout<<dp[m[n-1].t]<<endl;

27     }

28     return 0;

29 }
View Code

 

你可能感兴趣的:(OJ)