题目链接:https://loj.ac/problem/10246
解题思路
首先,我们将石堆分为热闹堆和寂寞堆,热闹堆的石子数大于1,寂寞堆的石子数等于1。我们设dp[i][j]表示有i个寂寞堆,和j次热闹堆操作下一次操作的人是否能取胜。
我们发现,如果只有热闹堆,只需要看当前能操作的数量的奇偶,就能判断之前操作的是否获胜,dp[0][j]=j&1。
如果此时有寂寞堆,则要分情况讨论。

  • 如果有大于等于两个寂寞堆,我们可以将寂寞堆合并,dp[i][j]=~dp[i-2][j+2]。如果此时还有热闹堆,还要多一次合并的操作,即dp[i][j]=~dp[i-2][j+2+(j?1:0)]。
  • 可以从寂寞堆里拿一个石头,dp[i][j]=~dp[i-1][j]。
  • 如果有热闹堆,可以从热闹堆里拿一个石头,dp[i][j]=~dp[i][j-1]。
  • 还可以将寂寞堆与热闹堆合并,dp[i][j]=~dp[i-1][j+1]。

除此以外,如果热闹堆操作数变为1了,那么此时热闹堆就变成了寂寞堆,dp[i+1][0]=dp[i][1]。
AC代码

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=55,M=1005;
int dp[N][N*M],a[N];
int dfs(int num,int sum)
{if(num<=0&&sum<=0)return 0;if(dp[num][sum]!=-1)return dp[num][sum];if(num<=0)return dp[num][sum]=sum&1;if(sum==1)return dp[num][sum]=dfs(num+1,0);dp[num][sum]=0;if(num&&!dfs(num-1,sum))//拿一个寂寞堆的石子return dp[num][sum]=1;if(sum&&!dfs(num,sum-1))//把一个热闹堆里拿掉一个石子return dp[num][sum]=1;if(num&&sum&&!dfs(num-1,sum+1))//把一个寂寞堆合并到热闹堆上return dp[num][sum]=1;if(num>1&&!dfs(num-2,sum+2+(sum?1:0)))//把两个寂寞堆合并return dp[num][sum]=1;return dp[num][sum];
}
int T,n,res,cnt;//res能操作热闹堆的总数,cnt寂寞堆的数量
int main()
{scanf("%d",&T);memset(dp,-1,sizeof(dp));while(T--){cnt=res=0;scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d",&a[i]);if(a[i]==1)cnt++;if(a[i]>1)res+=a[i]+1;}if(res)res--;int ans=dfs(cnt,res);if(ans)puts("YES");elseputs("NO");}return 0;
}

博弈论(四)——#10246. 「一本通 6.7 练习 3」取石子相关推荐

  1. 「一本通 6.5 练习 3」迷路

    「一本通 6.5 练习 3」迷路 题目描述 大意说一个给你有向图, 一个有n个节点,每个节点相连的边为所需要花费的时间, 问你从1到n 在时间刚好为t是的方案数.输出%2009 注意:不能在某个节点逗 ...

  2. 【C++】「一本通 1.1 例 4」加工生产调度

    「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...

  3. LibreOJ10082. 「一本通 3.3 例 1」Word Rings【二分+SPFA】

    10082. 「一本通 3.3 例 1」Word Rings [题目描述] 传送门 [题解] 将一个字符串看成一条边,字符两端的字符看成节点,长度看成权值.二分枚举答案,最后SPFA刷正环,因为只要有 ...

  4. #10016. 「一本通 1.2 练习 3」灯泡(三分)

    参考博客链接:「一本通 1.2 练习 3」灯泡(三分) #include<stdio.h> #include<string.h> #include<math.h> ...

  5. 【C++】「一本通 1.1 例 2」种树

    「一本通 1.1 例 2」种树 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [解析] [代码] [来源] 一本通题库-1423 LibreOJ-10001 vjud ...

  6. #10001. 「一本通 1.1 例 2」种树

    #10001. 「一本通 1.1 例 2」种树 满足n个区间种树的要求,求最少种多少棵数 思路 按照区间的尾巴来排序,因为如果区间有重叠的种在第一个区间的尾巴可以使得种树更少,所有每次始从尾巴开始种树 ...

  7. 【C++】「一本通 1.1 例 5」智力大冲浪

    「一本通 1.1 例 5」智力大冲浪 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1426 LibreOJ- ...

  8. #10017 「一本通 1.2 练习 4」传送带+三分套三分

    题目描述 原题来自:SCOI 2010 在一个 2 维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段  AB和线段CD .lxhgww 在  AB上的移动速度为 P ,在  ...

  9. loj10157. 「一本通 5.2 例 5」皇宫看守

    思路: 例四是覆盖全部边,dp两个状态,例五是覆盖全部点,dp三个状态. #include<cstdio> #include<iostream> #include<cst ...

  10. #10019. 「一本通 1.3 例 2」生日蛋糕

    冥想盆 感性理解深搜剪枝(看完这个再看下面的文章) 理解本题的思路 [代码实现1:最慢最好理解(自己打的):100多ms] [代码实现2:次慢:30多ms] [代码实现3:最快:10多ms] 最后放上 ...

最新文章

  1. IDC:2015年第四季度全球WLAN市场增幅最高
  2. QR分解原理与C实现(一般实矩阵)
  3. SAP Analytics Cloud学习笔记(一):从CSV文件导入数据到Analytics Cloud里创建模型和Story
  4. P1556 幸福的路
  5. 最大素数有用吗?安全上网就靠它
  6. python非法语句是_python 如何优雅的处理大量异常语句?
  7. 计算机组成原理中的直接映像,计算机组成原理cache存储器的直接映像与变换.doc...
  8. day07【后台】SpringSecurity
  9. ubuntu 18.04,无线网卡无驱动,连不上wifi,显示wifi没有适配器的解决方法
  10. zynq开发系列1:vivado和sdk联合使用串口打印helloworld
  11. 自己写的一个asp.net-cookies购物车类
  12. 《Javascript DOM 编程艺术》
  13. python入门第二十五天--反射 通过字符串的形式操作对象中的成员
  14. FFMPEG发布RTSP流
  15. 回溯法之迷宫问题(华为笔试题)
  16. Comware V7使用用户名密码方式登录设备典型配置
  17. 五类推荐系统算法,非常好使,非常全面
  18. 3d打印切片软件 linux,玩好3D打印机 从19款3D切片软件开始
  19. 何恺明新作来了!更快更有效的训练FLIP
  20. iPad 上能播放局域网高清片源影音播放利器XBMC使用体会

热门文章

  1. ELMO驱动器与nanotec电机通过compser软件调试PID参数的方式
  2. c语言例题18:完全平方数
  3. mysql mpm_部署zabbix监控mysql (三) MPM插件介绍和部署
  4. java将图片压缩到指定大小以内并保存图片
  5. 国庆高质量出行,可视化开启智慧旅游
  6. RootMe--HTTP verb tampering
  7. Excel 冻结首行
  8. 概率机器人书 电子版
  9. 微信大改版,时隔4年再次华丽转身。
  10. web前端入门到实战:CSS box-sizing属性的正确用法