配置魔药
【题目描述】
现在哈利面前有两个坩埚,有许多种药材要放进坩埚里,但一个坩埚加工时只能加工一种药材,而且不一定每一种药材都要加进坩埚里。加工每种药材都必须在某个起始时间和结束时间之内完成(包括起始时间和结束时间),每种药材都有一个加工后的药效,询问哈利可以得到的最大药效是多少。
【输入描述】
第1行输入两个整数,分别表示一节魔药课的时间t(1 ≤ t ≤ 500)和药材数n(1 ≤ n ≤ 100);
接下来n行,每行输入三个整数,分别表示加工第i种药材的起始时间t1、结束时间t2(1 ≤ t1 ≤ t2 ≤ t)和药效w(1 ≤ w ≤ 100)。
【输出描述】
输出一个正整数,表示最大药效。
【样例输入】
7 4
1 2 10
4 7 20
1 3 2
3 7 3
【样例输出】
35
源代码: #include<cstdio> #include<algorithm> using namespace std; struct Node { int L,R,S; }i[501]; int n,Time,ans,f[101][501][501]; bool Rule(Node t1,Node t2) { if (t1.L==t2.L) return t1.R<t2.R; return t1.L<t2.L; } int main() //双线程序列动态规划。 { scanf("%d%d",&Time,&n); for (int a=1;a<=n;a++) scanf("%d%d%d",&i[a].L,&i[a].R,&i[a].S); sort(i+1,i+n+1,Rule); //尽量按早的排序。 for (int a=1;a<=n;a++) //前多少个。 for (int b=0;b<a;b++) //坩埚1最后放的几号药品。 for (int c=0;c<a;c++) //坩埚2最后放的几号药品。 { f[a][b][c]=f[a-1][b][c]; //因为排过序了,所以没有别的顾虑。 if (i[a].L>i[b].R) //不冲突,可以更新。 f[a][a][c]=max(f[a][a][c],f[a-1][b][c]+i[a].S); if (i[a].L>i[c].R) //同理。 f[a][b][a]=max(f[a][b][a],f[a-1][b][c]+i[a].S); ans=max(ans,max(f[a][b][a],f[a][a][c])); //顺便更新答案。 } printf("%d",ans); return 0; }