【题解】luogu p1156 垃圾陷阱
背包
总结:
1.状态要根据问的问题设计,一开始我设计dp[i]是在i时间时的最高高度,而题目卡门最长可以活多久,这样设计的话若不能出去,则这个不好判断。所以设计为dp[i]是在i的高度时,卡门最多可以后活多久,这样问题便迎刃而解。
2.不用将牛的寿命减去时间,直接将牛可以存活的时间与当前时间比较即可。
3.关于状态设计时, dp[j+a[i].h] = max(dp[j+a[i].h], dp[j]);这个是选择堆积时,我们这时候直接选择最大的寿命即可
dp[j] += a[i].f; 这个是选则吃垃圾时的最大寿命。
#include<bits/stdc++.h> using namespace std; struct node{ int t, f, h; }a[105]; int d, g, dp[105]; bool cmp(node x, node y) { return x.t < y.t; } int main() { cin >> d >> g; for(int i = 1; i <= g; i++) cin >> a[i].t >> a[i].f >> a[i].h; sort(a+1, a+1+g, cmp); memset(dp, -0x3f, sizeof(dp)); dp[0] = 10; for(int i = 1; i <= g; i++) for(int j = d; j >= 0; j--) if(dp[j] >= a[i].t) { if(a[i].h+j >= d) { cout << a[i].t; return 0; } dp[j+a[i].h] = max(dp[j+a[i].h], dp[j]); dp[j] += a[i].f; } cout << dp[0]; return 0; }