标签:
2016-05-31 09:54:03
题目链接 :洛谷 P1156 垃圾陷阱
题目大意:
奶牛掉坑里了,给定坑的深度和方块的个数,每个方块都可以垫脚或者吃掉维持生命(初始为10)
若可以出来,求奶牛最早出来的时间,若出不来,求奶牛最长存活时间
解法:
背包DP
DP[i]表示在可以存活到i时刻的情况下,最大能到达的高度
每个状态的转移无非两种
1.垫脚 DP[i]+=a[k].h;
2.吃掉 DP[i+a[k].f]=max(DP[i+a[k].f],DP[i]);
初始:DP[10]=0;
如果死了,就直接待在原地不动,一直吃,就可以得到最大时间.
需要注意的地方:
1.每个方块DP完都要扫一次结果是否满足,满足直接退.
2.时间的上限从max(a[i].t)开始就行了,因为活得比最后一个方块下落时间还久没啥意义(还不如垫脚)
1 //垃圾陷阱 (洛谷 No.1156) 2 //背包DP 3 #include<stdio.h> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=1100; 7 const int maxm=110; 8 int DP[maxn]; 9 int D,G; 10 struct node 11 { 12 int t,f,h; 13 }; 14 node a[maxm]; 15 bool comp(node a,node b) 16 { 17 return a.t<b.t; 18 } 19 int main() 20 { 21 scanf("%d %d",&D,&G); 22 fill(DP,DP+maxn,-100000); 23 DP[10]=0; 24 for(int i=1;i<=G;i++) 25 { 26 scanf("%d %d %d",&a[i].t,&a[i].f,&a[i].h); 27 } 28 sort(a+1,a+1+G,comp); 29 for(int i=1;i<=G;i++) 30 { 31 for(int j=a[G].t;j>=a[i].t;j--) 32 { 33 DP[j+a[i].f]=max(DP[j+a[i].f],DP[j]); 34 DP[j]+=a[i].h; 35 } 36 for(int j=a[G].t+a[i].f;j>=a[i].t;j--) 37 { 38 if(DP[j]>=D) 39 { 40 printf("%d\n",a[i].t); 41 return 0; 42 } 43 } 44 } 45 int F=10; 46 for(int i=1;i<=G&&F>=a[i].t;i++) 47 { 48 F+=a[i].f; 49 } 50 printf("%d\n",F); 51 return 0; 52 }
标签:
原文地址:http://www.cnblogs.com/Neptune-/p/5544946.html