会议安排
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
解题:直接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 }