配置魔药

【题目描述】

现在哈利面前有两个坩埚,有许多种药材要放进坩埚里,但一个坩埚加工时只能加工一种药材,而且不一定每一种药材都要加进坩埚里。加工每种药材都必须在某个起始时间和结束时间之内完成(包括起始时间和结束时间),每种药材都有一个加工后的药效,询问哈利可以得到的最大药效是多少。

【输入描述】

第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;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5932782.html