【动态规划】Tom的烦恼

Tom的烦恼

(tom.pas/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[start[i]] = max(F[start[i]+1],F[end[i]]+val[i])


#include <cstdio>
#include <algorithm>
using std::max;

struct node
{
	long ind;
	long val;
	node* nxt;
};
node* head[100010];
long f[100010];

void insert(long s,long t,long v)
{
	node* nn = new node;
	nn -> ind = t;
	nn -> val = v;
	nn -> nxt = head[s];
	head[s] = nn;
}

long getint()
{
	long rs=0;bool sgn=1;char tmp;
	do tmp=getchar();
	while (!isdigit(tmp)&&tmp-'-');
	if (tmp=='-'){tmp=getchar();sgn=0;}
	do rs=(rs<<3)+(rs<<1)+tmp-'0';
	while (isdigit(tmp=getchar()));
	return sgn?rs:-rs;
}

int main()
{
	freopen("tom.in","r",stdin);
	freopen("tom.out","w",stdout);

	long n = getint();
	long maxt = 0;
	for (long i=1;i<n+1;i++)
	{
		long s = getint();
		long t = getint();
		long v = getint();
		insert(s,t,v);
		maxt = max(maxt,t);
	}

	for (long s=maxt;s>0;s--)
	{
		f[s] = f[s+1];
		for (node* tt=head[s];tt;tt=tt->nxt)
		{
			long t = tt->ind;
			long v = tt->val;

			f[s] = max(f[s],f[t]+v);
		}
	}

	printf("%ld",f[1]);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值