UVA 1558 - Number Game

题目链接

题意:20之内的数字,每次能够选一个数字,然后它的倍数,还有其它已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法

思路:利用dp记忆化去求解,要输出方案就枚举第一步就可以,状态转移过程中,选中一个数字,对应的变化写成一个函数,然后就是普通的博弈问题了,必胜态之后必有必败态,必败态之后全是必胜态

代码:

#include <stdio.h>
#include <string.h> const int N = 1050005;
int t, n, w, start, dp[N], ans[25], an; int getnext(int state, int x) {
for (int i = x; i <= 20; i += x)
if (state&(1<<(i - 2)))
state ^= (1<<(i - 2));
for (int i = 2; i <= 20; i++) {
if (state&(1<<(i - 2))) {
for (int j = x; i - j >= 2; j += x) {
if (!(state&(1<<(i - j - 2)))) {
state ^= (1<<(i - 2));
break;
}
}
}
}
return state;
} int dfs(int state) {
if (dp[state] != -1) return dp[state];
if (state == 0) return dp[state] = 0; for (int i = 2; i <= 20; i++) {
if (state&(1<<(i - 2))) {
if (dfs(getnext(state, i)) == 0)
return dp[state] = 1;
}
}
return dp[state] = 0;
} int main() {
int cas = 0;
scanf("%d", &t);
memset(dp, -1, sizeof(dp));
while (t--) {
start = 0; an = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &w);
start |= (1<<(w - 2));
}
for (int i = 2; i <= 20; i++) {
if (start&(1<<(i - 2))) {
if (dfs(getnext(start, i)) == 0)
ans[an++] = i;
}
}
printf("Scenario #%d:\n", ++cas);
if (an) {
printf("The winning moves are:");
for (int i = 0; i < an; i++)
printf(" %d", ans[i]);
printf(".\n");
}
else printf("There is no winning move.\n");
printf("\n");
}
return 0;
}

UVA 1558 - Number Game(博弈dp)的更多相关文章

  1. HDU 5623 KK's Number (博弈DP)

    KK's Number 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/K Description Our lovely KK h ...

  2. UVA 1557 - Calendar Game(博弈dp)

    UVA 1557 - Calendar Game 题目链接 题意:给定一个日期,两个人轮流走,每次能够走一月或者一天,问最后谁能走到2001.11.4这个日子 思路:记忆化搜索,对于每一个日期,假设下 ...

  3. UVA.10066 The Twin Towers (DP LCS)

    UVA.10066 The Twin Towers (DP LCS) 题意分析 有2座塔,分别由不同长度的石块组成.现在要求移走一些石块,使得这2座塔的高度相同,求高度最大是多少. 问题的实质可以转化 ...

  4. 博弈dp 以I Love this Game! POJ - 1678 为例

    写在前面的话 知识基础:一些基础的博弈论的方法,动态规划的一些知识 前言:博弈论就是一些关于策略或者游戏之间的最优解,动态规划就是对于一些状态之间转移的一些递推式(or 递归),dp分为很多很多种,比 ...

  5. uva 11885 - Number of Battlefields(矩阵高速幂)

    题目连接:uva 11885 - Number of Battlefields 题目大意:给出周长p,问多少种形状的周长为p的,而且该图形的最小包围矩阵的周长也是p,不包含矩形. 解题思路:矩阵高速幂 ...

  6. 博弈dp入门 POJ - 1678 HDU - 4597

    本来博弈还没怎么搞懂,又和dp搞上了,哇,这真是冰火两重天,爽哉妙哉. 我自己的理解就是,博弈dp有点像对抗搜索的意思,但并不是对抗搜索,因为它是像博弈一样,大多数以当前的操作者来dp,光想是想不通的 ...

  7. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  8. UVA 10404 Bachet's Game(dp + 博弈?)

    Problem B: Bachet's Game Bachet's game is probably known to all but probably not by this name. Initi ...

  9. UVa 12525 Boxes and Stones (dp 博弈)

    Boxes and Stones Paul and Carole like to play a game with S stones and B boxes numbered from 1 to B. ...

随机推荐

  1. Linux内核ROP学习

    0x00 前言 1.SMEP(Supervisor Mode Execution Protection):一种减缓内核利用的cpu策略,禁止内核态到用户态内存页的代码执行(32位的addresses ...

  2. XtraBackup做mysql主从同步

    一.背景: 线上一个主库压力比较大,所以增加一个从库,但是不能重启或者停止主库的正常运行,不能锁库锁表影响业务的正常运行.所以这里想到了XtraBackup 二.XtraBackup介绍: Xtrab ...

  3. GCC下32位与64位机器类型变量所占字节数

    GCC下32位与64位机器类型变量所占字节数 在C语言中,编译器一般根据自身硬件针对类型变量来选择合适的字节大小,下面列举一下在GCC编译器下32位机器与64位机器各个类型变量所占字节数目: C语言 ...

  4. MyEclipse笔记(2):debug的使用

    对于程序代码而言,学会调debug是重中之重,依此,掌握该技巧 以算1到50的和的代码为例: package com.front.action; public class debug { public ...

  5. Symfony2 HttpKernel事件驱动

    HttpKernel:事件驱动       Symfony2 框架层和应用层的工作都是在 HttpKernel::handle()方法中完成,HttpKernel::handle() 的内部的实现其实 ...

  6. vmware workstation 7.0官方下载安装

    https://my.vmware.com/group/vmware/downloads#tab2 这里注册后可以下载到vmware的所有产品,可以下载到免费的vmplayer,以及收费的vmware ...

  7. Tr A(HDU 1575 快速矩阵幂模板)

    Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. AngularJS自定义表单控件

    <!doctype html> <html ng-app="myApp"> <head> <script src="G:\\So ...

  9. webpack,react,babel

    window搭建webpack,react,babel傻瓜教程   首先现在的webpack教程已经很多了,写这篇的原因是因为自己在从小白开始的搭建过程中,并没有找到比较好的教程,花费了很多的时间,s ...

  10. BIOS讲解

    首先  BIOS其实没什么神奇的 就是  Bisic input/output System,所以基本输入输出系统是一块装入了启动和自检程序的EPROM或EEPROM集成块,实际上它是被固化在计算机R ...