代码:
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const ll Maxn=2e3+7;
ll n,m,Begin,A[Maxn],B[Maxn],T[Maxn],f[Maxn],MaxT,ans;
bool vis[Maxn];
void dfs(ll Pos,ll W,ll t){
if(t>MaxT) return ;
// 如果时间超出 MaxT ,那么再搜就没有意义
if(f[Pos]!=0&&t<T[f[Pos]]) W+=B[f[Pos]],ans=max(ans,W);
// 当前这个位置是否有 xxs,且时间来得及更新
for(ll i=Pos-1;i>=1;i--){
if(!vis[i]&&f[i]!=0&&t+(Pos-i)<T[f[Pos]])
{vis[Pos]=1;dfs(i,W,t+(Pos-i));vis[Pos]=0;break;}
} // 向左搜
for(ll i=Pos+1;i<=n;i++){
if(!vis[i]&&f[i]!=0&&t+(i-Pos)<T[f[Pos]])
{vis[Pos]=1;dfs(i,W,t+(i-Pos));vis[Pos]=0;break;}
} // 向右搜
}
int main(){
//freopen("pokeman.in","r",stdin);
//freopen("pokeman.out","w",stdout);
scanf("%lld%lld%lld",&n,&Begin,&m);
for(ll i=1;i<=m;i++)
scanf("%lld%lld%lld",&A[i],&B[i],&T[i]),MaxT=max(MaxT,T[i]),f[A[i]]=i;
dfs(Begin,0,0);
printf("%lld",ans);
return 0;
}
/*
10 5 4
1 30 4
3 5 7
7 10 12
9 100 23
20 8 7
1 35 14
4 57 1
6 32 2
9 94 28
14 78 8
15 8 1
17 55 3
*/