https://vjudge.net/problem/16276/origin
题意: 给一些区间,然后去区间权和的最大值,注意每个区间取完之后需要休息:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1000 + 10;
#define INF 0x3f3f3f3f
#define eps 10e-8
//const int maxn = 1000 + 10;
int n,m,k;
struct Node
{
int x;
int y;
int val;
}a[maxn];
bool cmp(Node x,Node y)
{
if(x.x == y.x)
return x.y < y.y;
return x.x < y.x;
}
int main()
{
while( ~ scanf("%d%d%d",&n,&m,&k))
{
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].val);
}
sort(a + 1,a + m + 1,cmp);
int dp[maxn] = {0};
for(int i = 1; i <= m; i++)
{
for(int j = m; j >= i + 1; j --)
{
if(a[j].x >= a[i].y + k)
{
dp[j] = max(dp[j],dp[i] + a[i].val);
}
}
}
int ans = 0;
for(int i = 1; i <= m; i ++)
{
dp[i] += a[i].val;
if(dp[i] > ans)
ans = dp[i];
}
cout << ans << endl;
}
return 0;
}