用的是第一种题解的思路,dp[高度] = 累计最大生命
#include<bits/stdc++.h>
using namespace std;
int depth, g;
int t[101], h[101], f[101];
int p[101];//用来给t、h、f数组的下标排序
int dp[200];
bool cmp(int x, int y) {
return t[x] < t[y];
}
int main() {
scanf("%d%d", &depth, &g);
for (int i = 1;i <= g;i++) {
scanf("%d%d%d", &t[i], &f[i], &h[i]);
p[i] = i;
}
//按时间排序,后面诸如t[p[i]]就是排序后的t
sort(p + 1, p + g + 1, cmp);
//初始化dp为-1
for (int i = 1;i <= depth;i++) {
dp[i] = -1;
}
dp[0] = 10;
for (int i = 1;i <= g;i++) {
for (int j = depth - 1; j >= 0;j--) {
//如果该高度的最大存活时间足够操作这个垃圾
if (dp[j] >= t[p[i]]) {
//这个if把超出洞口的状态也算作和洞口平齐
if (j + h[p[i]] >= depth) {
dp[depth] = dp[j];
}
else {
dp[j + h[p[i]]] = dp[j];
}
dp[j] += f[p[i]];
}
//否则什么都不做
}
//一旦dp[depth]被改动过,说明可以出去了
if (dp[depth] >= 0) {
printf("%d", t[p[i]]);
return 0;
}
}
//否则输出最长存活时间
printf("%d", dp[0]);
return 0;
}