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