hdu 4502(吉哥系列故事——临时工计划)

枚举的错误:

hdu 4502(吉哥系列故事——临时工计划) View Code
#include<stdio.h>

#include<algorithm>

using namespace std;

struct Node

{

    int s;//time start

    int e;// end

    int c;//money

}N[1010];

bool cmp(Node a,Node b)

{

    if(a.s<b.s)return true;

    else if(a.s==b.s&&a.c>b.c)return true;

    return false;

}

int main()

{

    int T,m,n;

    int max,mx;

    int js,k;

    scanf("%d",&T);

    while(T--)

    {

        scanf("%d %d",&m,&n);

        for(int i=0;i<n;i++)

        scanf("%d %d %d",&N[i].s,&N[i].e,&N[i].c);

        sort(N,N+n,cmp);

        //for(int i=0;i<n;i++)

        //printf("%d ",N[i].s);

        //printf("\n");

        max=0;

        for(int t=0;t<n;t++)

        {

            mx=0;

            k=t;  //当前工作安排

            js=-1;//当前的工作结束日

            //for(int k=t+1;N[k].e<=m;k++)

            while(k<n)

            {

               if(js<N[k].s&&N[k].e<=m)mx+=N[k].c,js=N[k].e;

               k++;

            }

            //printf("%d\n",mx);

            if(mx>max)max=mx;

        }



        printf("%d\n",max);

    }

    return 0;

}

测试数据:

1

7 3

1 3 5

4 6 5

4 7 10

 正确做法DP:

#include<stdio.h>

#include<string.h>

#include<algorithm>

using namespace std;

const int N=110;

int dp[N];

struct Node

{

    int s;//start

    int e;//end

    int c;//cost

} node[1010];

bool cmp(Node a,Node b)

{

    if(a.e<b.e)return true;

    return false;

}

int main()

{

    int _case,m,n;

    scanf("%d",&_case);

    while(_case--)

    {

        memset(dp,0,sizeof(dp));

        scanf("%d %d",&m,&n);

        for(int i=0; i<n; i++)

        {

            scanf("%d%d%d",&node[i].s,&node[i].e,&node[i].c);

        }

        sort(node,node+n,cmp);

        for(int i=1;i<=m;i++)

        for(int j=0;j<n;j++)

        {

            if(node[j].e>i)break;

            dp[i]=max(dp[i],dp[node[j].s-1]+node[j].c);

        }

        //for(int j=;j;j++)

        printf("%d\n",dp[m]);

    }

    return 0;

}

 

你可能感兴趣的:(HDU)