任务分配 - 题目 - Daimayuan Online Judge
类似于最长上升子序列
状态划分,以第i个数结尾的时间段的倒数第二个可能是第一个时间段,第二个时间段,...第i-1个是时间段
从第一个时间段开始枚举,以它为结尾,首先f[i]=q[i].w,自身算一个,然后再根据前一状态推出这一状态,上一个数j时间段j确定,就用f[j]+q[j].w就行,然后如果q[j].e<=q[i].s,说明可以作为上一个时间段,然后在众多可行的f[j]+q[i].w中取最大值就行
最后遍历一下每个时间段,比较以每个时间段为结尾的的最大值,输出最大的那个
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 10010;
struct Node {
int s, e, w;
bool operator<(const Node& W)const {
return e < W.e;
}
}q[N];
int f[N];
signed main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> q[i].s >> q[i].e >> q[i].w;
sort(q + 1, q + 1 + n);
for (int i = 1; i <= n; i++) {
f[i] = q[i]. w;
for (int j = 1; j <i; j++) {
if (q[i].s >= q[j].e) f[i] = max(f[i], f[j] + q[i].w);
}
}
int res = 0;
for (int i = 1; i <= n; i++) {
res = max(res, f[i]);
}
cout << res << endl;
}