#include <algorithm>
#include <iostream>
using namespace std;
const int MAX_N = 6008;
struct Proj
{
int P;
int L;
int D;
bool operator<(const Proj &r) const
{
return D < r.D;
}
} proj[MAX_N];
int dp[MAX_N];
int main()
{
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
auto &cur = proj[i];
cin >> cur.P >> cur.L >> cur.D;
}
sort(proj, proj + N);
int cd = 0;
for (int i = 0; i < N; i++)
{
const auto &cur = proj[i];
move(dp, dp + cd, dp + cur.D - cd);
fill(dp, dp + cur.D - cd, dp[cur.D - cd]);
cd = cur.D;
for (int j = cur.L; j <= cur.D; j++)
{
dp[j - cur.L] = max(dp[j - cur.L], dp[j] + cur.P);
}
}
cout << *dp << endl;
return 0;
}
dp[i]表示在考虑当前物品时,尾部空余时间为i时的最大利润。