【 bzoj 3895 】 取石子 - 博弈论

  只看出了操作数为奇数时必胜,后面并不会做了QAQ
  于是%了PO姐的题解>_<
  http://blog.csdn.net/popoqqq/article/details/43989101

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)

inline int rd() {
    char c = getchar();
    while (!isdigit(c)) c = getchar() ; int x = c - '0';
    while (isdigit(c = getchar())) x = x * 10 + c - '0';
    return x;
}

int n , a[53] , v[53][50061];

void input() {
    n = rd();
    rep (i , 1 , n) a[i] = rd();
}

#define ret return v[t1][t2] = 1

bool dfs(int t1 , int t2) {
    if (!t1) return t2 & 1;
    if (t2 == 1) return dfs(t1 + 1 , 0);
    if (v[t1][t2] != -1) return v[t1][t2];
    if (t1 >= 2 && !dfs(t1 - 2 , t2 + 2 + (t2 != 0))) ret;
    if (t1 && !dfs(t1 - 1 , t2)) ret;
    if (t1 && t2 && !dfs(t1 - 1 , t2 + 1)) ret;
    if (t2 && !dfs(t1 , t2 - 1)) ret;
    return v[t1][t2] = 0;
}

#undef ret

void solve() {
    int t1 = 0 , t2 = 0;
    rep (i , 1 , n) if (a[i] == 1) t1 ++ ; else t2 += a[i] + 1;
    if (t2) t2 --;
    puts(dfs(t1 , t2) ? "YES" : "NO");
}

int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.txt" , "r" , stdin);
    #endif
    memset(v , -1 , sizeof v);
    per (T , rd() , 1) {
        input();
        solve();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值