先将时间离散化,然后按结束时间排序,最后按时间DP。
ACcode:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
__int64 max(__int64 a,__int64 b)
{
return a>b?a:b;
}
struct Edge
{
__int64 s,e,w;
};
bool cmp(__int64 *a,__int64 *b)
{
return *a<*b;
}
bool cmpedge(Edge a,Edge b)
{
return a.e<b.e;
}
Edge edge[100010];
__int64 *p[200020];
__int64 dp[200020];
int vis[200020];
int main()
{
// freopen("1455.in", "r", stdin);
// freopen("out.txt", "w", stdout);
int n,top,i,j;
while(~scanf("%d",&n))
{
for(top=0,i=1; i<=n; i++)
{
scanf("%I64d %I64d %I64d",&edge[i].s,&edge[i].e,&edge[i].w);
p[top++] = &edge[i].s;
p[top++] = &edge[i].e;
}
sort(p,p+top,cmp);
int ii = 0;
for(i=0; i<top; i++)
{
if(i<top-1&&*p[i]==*p[i+1])
{
*p[i]=ii;
continue;
}
*p[i] = ii;
ii++;
}
sort(edge+1,edge+n+1,cmpedge);
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
__int64 Max = 0;
vis[0]=1;
for(i = 1; i<=n; i++)
{
j = edge[i].s;
while(!vis[j]) j--;
dp[edge[i].e] = max(dp[j]+edge[i].w,Max);
vis[edge[i].e] = 1;
Max = max(dp[edge[i].e],Max);
}
printf("%I64d\n",Max);
}
}