dfs 求调
查看原帖
dfs 求调
590600
Kreado楼主2022/10/2 16:35

代码:

#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
*/
2022/10/2 16:35
加载中...