2013腾讯编程马拉松初赛第0场(3月20日)HDU 4502

#include<iostream>
#include<algorithm>
using namespace std;

#define Max(a,b)(a>b?a:b)

int m,n;

struct Job
{
	int s,e,val;
};
Job TT[1005];

int dp[105];

bool cmp(Job a,Job b)
{
	return a.e<b.e;
}

void run()
{
	int i,j;
	scanf("%d%d",&m,&n);

	fill(dp,dp+105,0);

	for(i=0;i<n;i++)
	{
		scanf("%d%d%d",&TT[i].s,&TT[i].e,&TT[i].val);
	}
	sort(TT,TT+n,cmp);

	for(i=1;i<=m;i++)
	{
		for(j=0;j<n;j++)
		{
			if(TT[j].e>i) break;
			dp[i]=Max(dp[i],dp[TT[j].s-1]+TT[j].val);
		}
	}
	printf("%d\n",dp[m]);
}

int main()
{
	int T;
	cin>>T;
	while(T--) run();
	return 0;
}

简单的一维DP:dp[i[表示到第i天为止 所能够赚最多的钱!

转移方程 dp[i]=Max(dp[i],dp[i-TT[j].s-1]+TT[j].val)

预处理:将n个工作排序 按结束时间早优先。

循环DP时 if(TT[j].e>i) break;

你可能感兴趣的:(2013腾讯编程马拉松初赛第0场(3月20日)HDU 4502)