题意:
两个人分别有一些攻击力,谁先杀死了怪兽谁就赢了,问谁能赢。
做法:
fi,flag表示当前怪兽收到的伤害为i,在flag状态下谁能赢。flag为 1代表先手赢,flag为2代表后手赢。
显然dfs的时候可以稍微剪枝一下,(类似今年的多校的某场德州扑克)。
但是这题的状态不是很多,不加这个剪枝也能过。
但是因为两个人都有的攻击力比较多,而且攻击轮数也会比较多,所以是可以记忆化搜索的。
int a[N], b[N], f[2005][2];
int n, m, k;
int dfs(int x, int flag)
{
if (x >= k)
{
if (!flag) return 2;
else return 1;
}
if (f[x][flag] != -1) return f[x][flag];
if (!flag)
{
for (int i = 1; i <= n; i++) {
int ret = dfs(x + a[i], flag ^ 1);
if (ret == 1) return f[x][flag] = 1;
}
return f[x][flag] = 2;
}
else{
for (int i = 1; i <= m; i++){
int ret = dfs(x + b[i], flag ^ 1);
if (ret == 2) return f[x][flag] = 2;
}
return f[x][flag] = 1;
}
}
void solve()
{
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= m; i++) cin >> b[i];
for (int i = 0; i <= k; i++) f[i][0] = f[i][1] = -1;
int ret = dfs(0, 0);
if (ret == 1) cout << "AsindE\n";
else cout << "slwang\n";
}