洛谷P1156 垃圾陷阱

果然喜欢把简单的题想复杂呵呵

01背包

f[I][j]表示使用完第I个垃圾,高度为j时的最大剩余生命值,因为同一高度生命值越多越优

转移显然

但是此题坑很多。。特别要注意在每个垃圾下落之前,判断所剩生命值减去此垃圾与上一个垃圾的间隔是否大于等于0.

#include
#include
#include
#define dp f
#define maxn 100+5
#define maxh 25+5
#define inf 0x7ffff
using namespace std;
struct waste{
	int t,h,e;
	friend bool operator < (waste a,waste b){
		return a.t>d>>g;	
	for(int i=1;i<=g;i++){
		cin>>a[i].t>>a[i].e>>a[i].h;
	}
	sort(a+1,a+g+1);
	for(int i=0;i=0;j--){
			int hh=a[i].h,ee=a[i].e,cc=cost(i);
			if(j-hh>=0){
				f[i][j]=max(f[i][j],f[i-1][j-hh]-cc);
			}
			if(f[i-1][j]-cc>=0){
				f[i][j]=max(f[i][j],f[i-1][j]-cc+ee);
			}
			if(j>=d&&f[i][j]>=0){
				cout<0)i++;
	cout<

你可能感兴趣的:(DP)