P10132
博客园。
我们发现直接模拟就好了,在 dfs 中,会有很多个参数。例如:
我们对 dfs 进行剪枝即可。四个参数可以开一个数组来记忆化,但是空间会炸,所以开一个 map。
map<pair<pair<int,int>,pair<int,int> >,bool> mp;
这个记忆化只用记录是否走到,所以是一个 bool 类型。
这样,我们直接暴力模拟即可。轻松 AC!
int n,s;
int q[N], a[N];
struct node{
int x,d,f,cnt;
};
map<pair<pii,pii>,int> mp;
int ans=0;
int vis[N];
void dfs(int x,int d,int f,int cnt){
if(x < 1 || x > n) return ;
if(q[x] &&!vis[x]&& d >= a[x]){
vis[x]=1;
cnt++;
}
if(mp.find({{x,d},{f,cnt}}) != mp.end()) return ;
mp[{{x,d},{f,cnt}}] = 1;
ans = max(ans,cnt);
if(q[x]){
if(f) dfs(x+d,d,f,cnt);
else dfs(x-d,d,f,cnt);
}else{
d += a[x];
if(f) dfs(x-d,d,!f,cnt);
else dfs(x+d,d,!f,cnt);
}
}
void solve() {
cin >> n >> s;
for (int i = 1; i <= n; i++)cin >> q[i] >> a[i];
dfs(s,1,1,0);
cout<<ans;
}