ABC195E
其实我们发现很多博弈论的动态规划都是从后往前的,比如过河卒和本题。
这是因为从某种角度上来说这些动态规划有后效性而无前效性。
所以设计状态 \(dp_{i,j}\) 表示第 \(i\) 次操作 \(T\) 模 \(7\) 的余数为 \(j\) 的情况下能否走到 Takahashi 的胜利状态。
然后就是正常的博弈论倒序转移。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 3e5+114;
string X,S;
int n;
int dp[maxn][10];//第 i 次操作后 base-10 T % 7 = j 是否可能达成目标
signed main(){
cin>>n;
cin>>X>>S;
dp[n][0]=1;
for(int i=n-1;i>=0;i--){
for(int j=0;j<7;j++){
if(S[i]=='T'){
dp[i][j]=dp[i+1][(j*10+((int)(X[i]-'0')%7))%7]|dp[i+1][(j*10)%7];
}
else{
dp[i][j]=dp[i+1][(j*10+((int)(X[i]-'0')%7))%7]&dp[i+1][(j*10)%7];
}
}
}
cout<<(dp[0][0]==1?"Takahashi":"Aoki");
}