# 洛谷OJ: P1156 垃圾陷阱(DP)

dp[i][j] = {dp[i-1][j+f[i]-(t[i]-t[i-1])]/*吃垃圾*/, dp[i-1][j-(t[i]-t[i-1])]+h[i]/*堆垃圾*/}

dp[i][j] = {dp[i-1][j]+f[i]-(t[i]-t[i-1])/*吃垃圾*/, dp[i-1][j+h[i]]-(t[i]-t[i-1])/*堆垃圾*/}

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int maxn = 1000+10, maxg = 100+10;
struct Rubbish{
int t, f, h;
bool operator < (Rubbish a) const { return t < a.t; }
}r[maxg];
int dp[maxn][maxn], ans, d, g;

int main() {
ios::sync_with_stdio(false);
cin >> d >> g;
for(int i = 1; i <= g; i++) cin >> r[i].t >>  r[i].f >> r[i].h;
sort(r+1, r+1+g);
memset(dp, -0x3f, sizeof(dp)); dp[0][0] = 10;
for(int i = 1; i <= g; i++) {
int h = r[i].h, t = r[i].t - r[i-1].t, f = r[i].f;
for(int j = 0; j <= h+d; j++) {
if(dp[i-1][j] >= t) dp[i][j] = max(dp[i][j], dp[i-1][j] + f - t);
if(j-h >= 0) if(dp[i-1][j-h] >= t) dp[i][j] = max(dp[i][j], dp[i-1][j-h] - t);
if(dp[i][j] >= 0 && j >= d) {
cout << r[i].t << endl;
return 0;
}
}
}
for(int i = 0; i <= g; i++) ans = max(ans, dp[i][0] + r[i].t);
cout << ans << endl;
return 0;
}


• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120