题意:
小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠)。
题解:动态规划,
dp【i】 表示;前i个项目中val 的最大值。
dp【i】=max(dp【i-1】,dp【x】+val[i]) x表示i之前与的结尾时间小于i的开始时间的最后一个。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define FF freopen("Input.txt","r",stdin)
#define mem(x,y) memset(x,y,sizeof(x))
struct oo
{
int x,y;
int val;
bool operator <(const struct oo&t) const
{
if(y==t.y) return x<t.x;
return y<t.y;
}
}e[5050];
int dp[5050];
int check(int k)
{
int l=0,r=k-1;
int ans=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(e[k].x>=e[mid].y)
{
l=mid+1;
ans=mid;
}
else r=mid-1;
}
return ans;
}
int main()
{
//FF;
int n,i;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].val);
sort(e,e+n);//按y排序
mem(dp,0);
dp[0]=e[0].val;
for(i=1;i<n;i++)
{
int j=check(i);
if(j>=0)
{
dp[i]=max(dp[i-1],dp[j]+e[i].val);
}
else dp[i]=max(dp[i-1],e[i].val);
}
printf("%d\n",dp[n-1]);
}
return 0;
}