随笔 - 258  文章 - 1  评论 - 0  阅读 - 3659

E - Remove Pairs(状压dp+博弈论)

 

思路:

容易发现,我们取走一张牌后:

如果下一步的人必败,则这一步的人必胜,因为可以走这个状态。反之,这个人必败。

代码:

复制代码
#include <bits/stdc++.h>
using namespace std;
int n, a[21], b[21], f[2000005];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i] >> b[i];
    for (int S = 0; S <= ((1 << n) - 1); S++)//状压dp
        for (int i = 1; i <= n; i++)
            for (int j = i + 1; j <= n; j++)
                if (!(S & (1 << i - 1)))
                    if (!(S & (1 << j - 1)))//两张牌都没选才能 dp
                        if (a[i] == a[j] || b[i] == b[j])
                            if (!f[S])   //如果当前状态的上一个状态为先手必败,那么可以转移,因为上次必败,那么这次先手必胜。
                                f[S | (1 << i - 1) | (1 << j - 1)]++;
    if (!f[(1 << n) - 1])//判断是否先手必胜
        cout << "Aoki";
    else
        cout << "Takahashi";
}
复制代码

 

posted on   临江柔  阅读(20)  评论(0编辑  收藏  举报
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示