https://vjudge.net/problem/HDU-6495
思路:
用d[i][j]表示前i个挑战做j个体力值的最大值,类似于一种贪心策略,就是让体力值尽可能的大,这样就保证了会有更多的可能去完成更多的挑战。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 10;
const ll inf = 1e13;
ll d[maxn][maxn];
ll a[maxn], b[maxn], c[maxn];
int main()
{
// freopen("i.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
ll n, cc;
scanf("%lld%lld", &n, &cc);
for(int i = 1; i <= n; i++) scanf("%lld%lld%lld", &a[i],&b[i],&c[i]);
memset(d,-1,sizeof(d));
d[0][0] = cc;
c[0] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= n; j++) {
if(j >= 1 && d[i-1][j-1] != -1 && min(d[i-1][j-1] + c[i-1], b[i]) > a[i]) {
d[i][j] = min(d[i-1][j-1] + c[i-1], b[i]) - a[i];
}
if(d[i-1][j] != -1) d[i][j] = max(d[i][j], d[i-1][j] + c[i-1]);
}
}
for(int i = n; i >= 0; i--) {
if(d[n][i] > 0) {
printf("%d\n", i);
break;
}
}
}
return 0;
}