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背包,一顿瞎搞

 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

 

posted @ 2015-07-07 15:51  狂徒归来  阅读(272)  评论(0编辑  收藏  举报