X-man

导航

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;
}

 

posted on 2013-04-23 13:14  雨钝风轻  阅读(226)  评论(0编辑  收藏  举报