继续动态规划--安排问题

九度1499:项目安排http://ac.jobdu.com/problem.php?pid=1499

九度1463:招聘会http://ac.jobdu.com/problem.php?pid=1463

都是时间安排问题,dp数组下标可以表示时间也可以表示项目数,具体方法可以学习博客http://blog.csdn.net/wdy_yx/article/details/9833897,总结的很好。

我自己在做的时候,忘记了先按结束时间排序,如果不按照结束时间先后来安排,如先安排结束晚的,再安排结束早的,那么先开始早的再开始晚的这种情况就不会被考虑到。另外,项目安排这题虽然用dp数组下标表示时间是可以正确得出结果的,但由于时间可能很大,遍历数组费时,所以很容易超时。ac代码如下:

1463:

#include <stdio.h>
#include <memory.h>
#include <algorithm>
using namespace std;

struct hui
{
	int s,e;
	bool operator < (const hui &a) const
	{
		return e<a.e;
	}
}hui[1000];

int main()
{
	int n;
	while (scanf("%d",&n)!=EOF)
	{
		int late=0;
		for (int i=0;i<n;++i)
		{
			scanf("%d %d",&hui[i].s,&hui[i].e);
			if (late<hui[i].e) late=hui[i].e;
		}
		sort(hui,hui+n);
		int dp[late+1];
		memset(dp,0,sizeof dp);
		for (int i=0;i<n;++i)
			for (int j=late;j>=hui[i].e;--j)
				if (dp[j]<dp[hui[i].s]+1)
					dp[j]=dp[hui[i].s]+1;
		printf("%d\n",dp[late]);
	}
	return 0;
}

1499:

#include <stdio.h>
#include <memory.h>
#include <algorithm>
using namespace std;

struct pro
{
	int s,e,v;
	bool operator < (const pro &a) const
	{
		return e<a.e;
	}
}buf[10000];

int main()
{
	freopen("input.txt","r",stdin);
	int n;
	while (scanf("%d",&n)!=EOF)
	{
		int late=0;
		for (int i=1;i<=n;++i)
		{
			scanf("%d%d%d",&buf[i].s,&buf[i].e,&buf[i].v);
			if (buf[i].e>late)
				late=buf[i].e;
		}
		sort(buf+1,buf+n+1);
		int dp[n+1];
		memset(dp,0,sizeof dp);
		for (int i=1;i<=n;++i)
		{
			int last=0;
			for (int j=i-1;j>0;--j)
				if (buf[j].e<=buf[i].s)
				{
					last=j;break;
				}
			for (int j=n;j>=i;--j)
			if (dp[last]+buf[i].v>dp[j])
				dp[j]=dp[last]+buf[i].v;
		}
		printf("%d\n",dp[n]);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章