POJ3616
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 using namespace std; 5 struct node{ 6 int l,r,val; 7 }aa[1001]; 8 int cmp( const void *a , const void *b ) 9 { 10 node *c = (node *)a; 11 node *d = (node *)b; 12 if(c->l != d->l) return c->l - d->l; 13 else return c->r - d->r; 14 } 15 int dp[1001]; 16 int main(){ 17 int n,m,r,ans,i,a,b,c,j; 18 scanf("%d%d%d",&n,&m,&r); 19 for(i=0;i<m;i++){ 20 scanf("%d%d%d",&a,&b,&c); 21 aa[i].l=a; 22 aa[i].r=b+r; 23 aa[i].val=c; 24 } 25 qsort(aa,m,sizeof(aa[0]),cmp); 26 ans=0; 27 for(i=0;i<m;i++) dp[i]=aa[i].val; 28 for(i=1;i<m;i++){//0 29 for(j=0;j<i;j++){ 30 if(aa[i].l>=aa[j].r) 31 dp[i]=max(dp[i],dp[j]+aa[i].val); 32 } 33 ans=max(ans,dp[i]); 34 } 35 ans=max(ans,dp[0]); 36 printf("%d\n",ans); 37 return 0; 38 }
这道题的思想就是DP;
首先,排序,然后,dp[i]代表的是在0到 i 段时间段之间所能得到的最多的牛奶质量。
所以,当第一层循环到 i 时,aa[i] 如果取则 dp[i]=dp[j]+aa[i].val;(注意此时,dp[i]!=dp[i-1]+aa[i].val,因为有时间段的原因,可能 dp[i-1] 更本就不符合条件)
如果不取,则 dp[i]=dp[i];
keep moving...