【动态规划】Tom的烦恼 tom.pas/c/cpp/in/out

Tom的烦恼

(tom.pas/c/cpp/in/out)

Problem

Tom是一个非常有创业精神的人,由于大学学的是汽车制造专业,所以毕业后他用有限的资金开了一家汽车零件加工厂,专门为汽车制造商制造零件。由于资金有限,他只能先购买一台加工机器。现在他却遇到了麻烦,多家汽车制造商需要他加工一些不同零件(由于厂家和零件不同,所以给的加工费也不同),而且不同厂家对于不同零件的加工时间要求不同(有些加工时间要求甚至是冲突的,但开始和结束时间相同不算冲突)。

Tom当然希望能把所有的零件都加工完,以得到更多的加工费,但当一些零件的加工时间要求有冲突时,在某个时间内他只能选择某种零件加工(因为他只有一台机器),为了赚得尽量多的加工费,Tom不知如何进行取舍。

现在请你帮Tom设计一个程序,合理选择部分(或全部)零件进行加工,使得得到最大的加工费。

Input

第一行是一个整数n(n<=30000),表示共有n个零件须加工。

接下来的n行中,每行有3个整数,分别表示每个零件加工的时间要求。

第一个表示开始时间,第二个表示该零件加工的结束时间,第三个表示加工该零件可以得到的加工费。

注:数据中的每个数值不会超过100000.

Output

输出一个整数,表示Tom可以得到的最大加工费。

Sample Input

3

1  3  10

4  6  20

2  5  25

 

Sample Output

30

 

 

 

这一题和 最优时间表 有点像,似乎还简单了不少

方程f[t]=f[head[t]->t]+head[t]->f;       (t是当前时间,node是以时间 t 结尾工作)

 

C++ Code

/*
C++ Code
http://oijzh.cnblogs.com
*/
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 30010
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define INF 0x7fffffff

int n;
struct link{int t,f;link* next;};
link *head[100010];
int tmax=0,tmin=INF;
int f[100010];

void inlink(int x,int t,int f)
{
    link* node=new link;
    node->t=t;
    node->f=f;
    node->next=head[x];
    head[x]=node;
}

int main()
{
    freopen("tom.in","r",stdin);
    freopen("tom.out","w",stdout);
    scanf("%d",&n);
    int i,x,y,z;
    for(i=1;i<=n;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        inlink(y,x,z);
        tmax=max(tmax,y);
        tmin=min(tmin,x);
    }
    int maxx=-INF;
    link *node;
    for(int t=tmin;t<=tmax;t++)
    {
        f[t]=max(f[t],f[t-1]);
        node=head[t];
        while(node)
        {
            f[t]=max(f[t],f[node->t]+node->f);
            node=node->next;
        }
        maxx=max(maxx,f[t]);
    }

    printf("%d",maxx);
    return 0;
}

  

 

posted @ 2012-10-24 16:27  jiangzh  阅读(295)  评论(0编辑  收藏  举报