粘代码
#include <bits/stdc++.h>
#define N 20000
using namespace std;
struct T
{
int x, y, z;
}a[N];
int dp[N][200], w[N], t,s,n;
inline int max(int a, int b)
{
if(a < b) return b;
return a;
}
inline int min(int a, int b)
{
if(a < b) return a;
return b;
}
int dfs(int x,int y)
{
if(x == 5 && y == 5)
int u = 1;
if(x > t)return -0x3f3f3f3f;
if(x == t) return 0;
if(dp[x][y] != -1)return dp[x][y];
int &ret = dp[x][y] = 0;
for(int i = 1; i <= s; i ++)
{
if(a[i].x < x)continue;
ret = max(ret, dfs(a[i].x + a[i].y,a[i].z));
}
ret = max(ret, dfs(x + 1, y));
ret = max(ret, dfs(x + w[y], y) + 1);
return ret;
}
int main()
{
int x,y;
scanf("%d%d%d",&t,&s,&n);
for(int i = 1; i <= s; i ++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
memset(dp, -1, sizeof(dp));
memset(w, 0x3f, sizeof(w));
for(int i = 1; i <= n; i ++)
{
scanf("%d%d", &x, &y);
w[x] = min(w[x], y);
}
for(int i = 1; i <= 100; i ++)
w[i] = min(w[i], w[i - 1]);
int ans = dfs(0, 1);
printf("%d\n",ans);
return 0;
}