九度1499:项目安排http://ac.jobdu.com/problem.php?pid=1499
九度1463:招聘会http://ac.jobdu.com/problem.php?pid=1463
都是时间安排问题,dp数组下标可以表示时间也可以表示项目数,具体方法可以学习博客http://blog.youkuaiyun.com/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;
}