HDU 4502

来源:互联网 发布:evisu淘宝正品 编辑:程序博客网 时间:2024/06/09 21:40

吉哥系列故事——临时工计划

动态规划: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);    }}


原创粉丝点击