63pts:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mkp make_pair
#define pb push_back
#define PII pair<int, int>
#define PLL pair<ll, ll>
const int inf = 0x3f3f3f3f;
int D, G, f[110][150];
struct node {
int T, F, h;
bool operator < (const node x) const {
return T < x.T;
}
}rb[110];
int main(){
scanf("%d%d", &D, &G);
for(int i = 1; i <= G; i++)
scanf("%d%d%d", &rb[i].T, &rb[i].F, &rb[i].h);
sort(rb + 1, rb + G + 1);
for(int i = 0; i <= G; i++)
for(int j = D + rb[i].h; j >= 0; j--)
f[i][j] = -inf;
f[0][0] = 10;
int ans = -1, res = 10;
for(int i = 1; i <= G; i++) {
for(int j = D + rb[i].h; j >= 0; j--) {
if(j >= rb[i].h && f[i - 1][j - rb[i].h] >= rb[i].T - rb[i - 1].T)
f[i][j] = max(f[i][j], f[i - 1][j - rb[i].h] - (rb[i].T - rb[i - 1].T));
if(f[i - 1][j] >= rb[i].T - rb[i - 1].T)
f[i][j] = max(f[i][j], f[i - 1][j] - (rb[i].T - rb[i - 1].T) + rb[i].F);
//cout<<j<<" "<<D<<" "<<f[i][j]<<endl;
if(j >= D && f[i][j] != -inf) {
// cout<<i<<"*"<<j<<endl;
ans = rb[i].T; break;
}
if(f[i][j] != -inf) res = max(res, rb[i].T + f[i][j]);
}
if(ans != -1) break;
}
if(ans == -1) printf("%d\n", res);
else printf("%d\n", ans);
return 0;
}
/*
1000 1
1 1000000000 1
*/
100pts:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mkp make_pair
#define pb push_back
#define PII pair<int, int>
#define PLL pair<ll, ll>
const int inf = 0x3f3f3f3f;
int D, G, f[110][150];
struct node {
int T, F, h;
bool operator < (const node x) const {
return T < x.T;
}
}rb[110];
int main(){
scanf("%d%d", &D, &G);
for(int i = 1; i <= G; i++)
scanf("%d%d%d", &rb[i].T, &rb[i].F, &rb[i].h);
sort(rb + 1, rb + G + 1);
for(int i = 0; i <= G; i++)
for(int j = D + rb[i].h; j >= 0; j--)
f[i][j] = -inf;
f[0][0] = 10;
int ans = -1, res = 10;
for(int i = 1; i <= G; i++) {
for(int j = D + rb[i].h; j >= 0; j--) {
if(j >= rb[i].h && f[i - 1][j - rb[i].h] >= rb[i].T)
f[i][j] = max(f[i][j], f[i - 1][j - rb[i].h]);
if(f[i - 1][j] >= rb[i].T)
f[i][j] = max(f[i][j], f[i - 1][j] + rb[i].F);
if(j >= D && f[i][j] != -inf) {
ans = rb[i].T; break;
}
if(f[i][j] != -inf) res = max(res, f[i][j]);
}
if(ans != -1) break;
}
if(ans == -1) printf("%d\n", res);
else printf("%d\n", ans);
return 0;
}
/*
1000 1
1 1000000000 1
*/
对比可以发现,只是在dp的过程中有没有直接减去 rb[i].T - rb[i - 1].T
我:????