吉哥系列故事——临时工计划
动态规划:dp[i]表示i天为止获得的最大工资。
转移方程:dp[i] = max{dp[i-1], dp[i], dp[ s[j] - 1 ]+ c[j]},其中e[j] = i;
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using std::memset;
using std::vector;
using std::sort;
const int MAXM = 101;
const int MAXN = 1001;
vector<int> timeline[MAXM];
struct JOB
{
int s,e,c;
}job[MAXN];
int n, m, t, dp[MAXM];
bool cmp(JOB a, JOB b)
{
return a.e < b.e;
}
int max(int a,int b)
{
return a<b?b:a;
}
int main()
{
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &m, &n);
for(int i = 0; i < n; i++)
{
scanf("%d%d%d", &job[i].s, &job[i].e, &job[i].c);
}
sort(job, job+n, cmp);
for(int i = 0 ; i < MAXM; i++)
{
timeline[i].clear();
}
for(int i = 0 ; i < n; i++)
{
if(job[i].e <= m)
timeline[job[i].e].push_back(i);
}
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= m; i++)
{
int v1 = dp[i-1];
for(int j = 0 ; j < timeline[i].size(); j++)
{
JOB temp = job[timeline[i][j]];
if(temp.s >= 1)
{
v1 = max(v1, dp[temp.s - 1] + temp.c);
}
}
dp[i] = max(v1, dp[i]);
}
int ans = 0;
for(int i = 1; i <= m; i++)
{
ans = max(ans, dp[i]);
}
printf("%d\n", ans);
}
}