option=com_onlinejudge&Itemid=8&page=show_problem&problem=4332" target="_blank" style="">题目链接:uva 1557 - Calendar Game

题目大意:给定一个日期,每次能够选择加一个月,或者加一天,加一个月的前提是下一个月有相应的日期,比方1.30加一个月变成2.30是不合法的。日期上限为2001.11.4。两个人轮流操作。不能操作为失败。

解题思路:dp[y][m][d]表示相应日期是否为先手必胜。

预先处理就可以,注意细节,包含闰年等。分享代码。

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int Y = 105;
const int D = 15;
const int M = 35;
const int month[D] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int dp[Y][D][M]; bool is_year (int y) {
if (y % 100 == 0 && y % 400 == 0)
return true;
if (y % 4 == 0 && y % 100)
return true;
return false;
} int get_day (int y, int m) {
if (y == 2001 && m == 11)
return 4; if (m == 2 && is_year(y))
return 29;
return month[m];
} bool judge_day (int y, int m, int d) {
if (y > 101)
return false;
if (y == 101 && m > 11)
return false;
if (y == 101 && m == 11 && d > 4)
return false;
return true;
} bool getnext_day (int& yy, int& mm, int& dd, int y, int m, int d, int type) {
if (type) {
dd = d;
mm = m + 1; if (mm > 12) {
yy = y + 1;
mm = 1;
} else
yy = y; if (dd > get_day(yy + 1900, m))
return false; } else {
dd = d + 1; if (dd > get_day(y + 1900, m)) {
dd = 1;
mm = m + 1;
} else
mm = m; if (mm > 12) {
yy = y + 1;
mm = 1;
} else
yy = y;
}
return judge_day(yy, mm, dd);
} int SG (int y, int m, int d) {
if (dp[y][m][d] != -1)
return dp[y][m][d]; dp[y][m][d] = 0;
int yy, mm, dd; if (getnext_day(yy, mm, dd, y, m, d, 0)) {
if (SG(yy, mm, dd) == false)
dp[y][m][d] = 1;
} if (getnext_day(yy, mm, dd, y, m, d, 1)) {
if (SG(yy, mm, dd) == false)
dp[y][m][d] = 1;
}
return dp[y][m][d];
} void init () {
memset(dp, -1, sizeof(dp));
dp[101][11][4] = 0; for (int i = 0; i <= 101; i++) {
int limit_month = (i == 101 ? 11 : 12);
for (int j = 1; j <= limit_month; j++) {
int limit_day = get_day(1900+i, j); for (int d = 1; d <= limit_day; d++)
SG(i, j, d);
}
}
} int main () {
init();
int cas, y, m, d;
scanf("%d", &cas);
while (cas--) {
scanf("%d%d%d", &y, &m, &d);
printf("%s\n", dp[y-1900][m][d] ? "YES" : "NO");
}
return 0;
}

uva 1557 - Calendar Game(博弈)的更多相关文章

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

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

  2. UVA 1558 - Number Game(博弈dp)

    UVA 1558 - Number Game 题目链接 题意:20之内的数字,每次能够选一个数字,然后它的倍数,还有其它已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法 思路:利用dp ...

  3. Crazy Calendar (阶梯博弈变形)

    2011 was a crazy year. Many people all over the world proposed on 11-11-11, married on 11-11-11, som ...

  4. UVA 12293 - Box Game(博弈)

    UVA 12293 - Box Game 题目链接 题意:两个盒子,一開始一个盒子有n个球.一个仅仅有1个球,每次把球少的盒子中球消掉,把多的拿一些球给这个盒子.最后不能操作的输(球不能少于1个),A ...

  5. UVA 10891 区间DP+博弈思想

    很明显带有博弈的味道.让A-B最大,由于双方都采用最佳策略,在博弈中有一个要求时,让一方的值尽量大.而且由于是序列,所以很容易想到状态dp[i][j],表示序列从i到j.结合博弈中的思想,表示初始状态 ...

  6. UVA 10561 - Treblecross(博弈SG函数)

    UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',能够在'.'的位置放X.谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每一个串要是上面有 ...

  7. HDU 1079 Calendar Game 博弈

    题目大意:从1900年1月1日 - 2001年11月4日间选择一天为起点,两个人依次进行两种操作中的任意一种,当某人操作后为2001年11月4日时,该人获胜.问先手是否获胜 操作1:向后移一天 操作2 ...

  8. HDU 1079 Calendar Game (博弈或暴搜)

    题意:给定一个日期,然后 A 和 B 双方进行操作,谁先把日期变成2001年11月04日,将获胜,如果超过该日期,则输了,就两种操作. 第一种:变成下一天,比如现在是2001.11.3 变成 2001 ...

  9. LightOJ 1393 Crazy Calendar(博弈)题解

    题意:r*c方格中,每个格子有一定石子,每次移动每格任意数量石子,只能向下或者向右动一格,不能移动为败 思路:显然是Nim,到右下曼哈顿距离为偶数的不用管,因为先手动一下后手动一下最后移到右下后还是先 ...

随机推荐

  1. 大约sources.list和apt-get [转载]

    个人觉得,Debian这与最大的方便apt-get安装软件,apt-get这可能是工作:/etc/apt/sources.list文件中保存着一些server的设置,在这些server上有大量的能够用 ...

  2. 配置QtCreator+CDB远程调试环境(要设置_NT_SYMBOL_PATH和QT_PLUGIN_PATH和Path)

    相关环境信息:开发机Win7 x64.远程机器WinXP.调试器是CDB.Qt版本5.2.1 一.部署远程机器环境 我这里用的是虚拟机(Windows XP),根据你要调试的程序选择安装不同架构的Wi ...

  3. Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...

  4. html ui设计案例

    1.jquery特效:http://www.5icool.org 2. http://www.open-lib.com/Lib/1992.jsp

  5. 在cocos2d-x jsb/html5中设置触摸代理的方法

    和官方的说明不同,js binding的很多api和ch5版是不一样的.遇到不一样的就需要我们努力去看源码寻找了. 主要是以下几个文件 cocos2d_specifics.cpp cocos2d_sp ...

  6. HDU4869:Turn the pokers(费马小定理+高速幂)

    Problem Description During summer vacation,Alice stay at home for a long time, with nothing to do. S ...

  7. Delphi事件的广播2

    上篇文章写了将事件分离成类的方法来实现事件的广播,这次将参考观察者模式来实现事件的广播.模式中主要有这两个角色: 发布者:发布者保存着一张观察者的列表,以便在必要的时候调用观察者的方法. 观察者:观察 ...

  8. Java魔法堂:JVM的运行模式 (转)

    一.前言 JVM有Client和Server两种运行模式.不同的模式对应不同的应用场景,而JVM也会有相应的优化.本文将记录JVM模式的信息,以便日后查阅. 二.介绍 在$JAVA_HOME/jre/ ...

  9. ACM-最小生成树之畅通project——hdu1863

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  10. Advanced Data Structures

    Advanced Data Structures Advanced Data Structures