原题: http://poj.org/problem?id=3616
//dp[i]表示前i个区间的最大挤奶量 //先按结束时间从小到大排,这样当我们计算状态dp[i]才能从前面的的状态 中判断 ,再转移过来,判断的条件为 两个区间没有相交线段(由题意看,有相交点是可以的) //因为所有的数据的终止时间ending_time都在N之内,所以N其实没有用到。 //不明白,一开始我是想用dp[i]表示前i个小时最大的挤奶量,可是一直判我Runtime error,不明白数组也没有开小了,也觉得不会有下标越界的情况....郁闷 #include<cstdio> #include<algorithm> using namespace std; int max(int a,int b) { if(a>=b)return a; return b; } struct Node { int s; int e; int eff; }node[1010]; int cmp(Node a,Node b) { return a.e<b.e; } int main() { int limit,n,rr; while(~scanf("%d %d %d",&limit,&n,&rr)) { for(int i=0;i<n;i++) { scanf("%d %d %d",&node[i].s,&node[i].e,&node[i].eff); } sort(node,node+n,cmp); int m=-1; int dp[1010]={0}; for(int i=0;i<n;i++) { dp[i]= node[i].eff; for(int j=0;j<i;j++) { if(node[j].e+rr<=node[i].s) { dp[i]=max(dp[i],dp[j]+node[i].eff); } } m=max(m,dp[i]);//取较大值 } printf("%d\n",m); } return 0; }一直ER的代码
#include<cstdio> #include<algorithm> #include<stdlib.h> using namespace std; typedef long long ll; struct R { int s; int e; int eff; }r[1100]; int cmp(const void* aa,const void * bb) { R a=*(R *)aa; R b=*(R *)bb; return a.e>b.e; } ll max(ll a, ll b) { if(a>=b)return a; return b; } int main() { int limit,n,rr; while(~scanf("%d %d %d",&limit,&n,&rr)) { for(int i=0;i<n;i++) { scanf("%d %d %d",&r[i].s,&r[i].e,&r[i].eff); r[i].e=r[i].e+rr < limit?r[i].e+rr:limit; } qsort(r,n,sizeof(r[0]),cmp); ll *dp=(ll *)calloc(1000100,(sizeof(ll))); // int dp[1000001]={0}; int i=1; for(int j=0;j<n;) { if(r[j].e==i) { dp[i]=max(dp[i],dp[r[j].s]+r[j].eff); j++; if(j<n && r[j].e==r[j-1].e) { i--; } }else{ dp[i]=dp[i-1]; } i++; } printf("%lld\n",dp[r[n-1].e]); } return 0; }