uva 11927 - Games Are Important(组合游戏+记忆化)

题目链接:uva 11927 - Games Are Important

题目大意:给出一张无环有向图,并给出每个节点上的石子数,每次操作可以选择一个石子,向下一个节点移动。两人轮流操作,直到不能操作为失败者。

解题思路:有了图之后,用记忆化的方式处理出每个节点的SG值,取所有石子数为奇数的节点的Nim和。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 1005;

int N, M, g[maxn][maxn], c[maxn], s[maxn];

inline int SG(int u) {
    if (s[u] != -1)
        return s[u];

    int vis[maxn];
    memset(vis, 0, sizeof(vis));

    for (int i = 0; i < c[u]; i++) {
        int tmp = SG(g[u][i]);
        vis[tmp] = 1;
    }

    int ret = -1;
    while (vis[++ret]);
    return s[u] = ret;
}

void init () {
    int u, v;
    memset(s, -1, sizeof(s));
    memset(c, 0, sizeof(c));

    for (int i = 0; i < M; i++) {
        scanf("%d%d", &u, &v);
        g[u][c[u]++] = v;
    }

    for (int i = 0; i < N; i++)
        s[i] = SG(i);
}

int main () {
    while (scanf("%d%d", &N, &M) == 2 && N + M) {
        init();
        int ans = 0, u;
        for (int i = 0; i < N; i++) {
            scanf("%d", &u);
            if (u&1)
                ans ^= s[i];
        }
        printf("%s\n", ans ? "First" : "Second");
    }
    return 0;
}

uva 11927 - Games Are Important(组合游戏+记忆化),布布扣,bubuko.com

时间: 2024-10-09 14:33:33

uva 11927 - Games Are Important(组合游戏+记忆化)的相关文章

UVA 11927 - Games Are Important(sg函数)

UVA 11927 - Games Are Important 题目链接 题意:给定一个有向图,结点上有一些石头,两人轮流移动石头,看最后谁不能移动就输了,问先手还后手赢 思路:求出每个结点的sg函数,然后偶数个石头结点可以不用考虑,因为对于偶数情况,总步数肯定能保证是偶数,所以只要考虑奇数情况的结点 代码: #include <stdio.h> #include <string.h> #include <algorithm> #include <vector&g

UVA - 11927 Games Are Important (SG)

Description  Games Are Important  One of the primary hobbies (and research topics!) among Computing Science students at the University of Alberta is, of course, the playing of games. People here like playing games very much, but the problem is that t

UVa 10651 Pebble Solitaire (DP 卵石游戏 记忆化搜索)

 题意  给你一个长度为12的字符串  由字符'-'和字符'o'组成  其中"-oo"和"oo-"分别可以通过一次转换变为"o--"和"--o"  可以发现每次转换o都少了一个  只需求出给你的字符串做多能转换多少次就行了 令d[s]表示字符串s最多可以转换的次数  若s可以通过一次转换变为字符串t  有d[s]=max(d[s],d[t]+1) #include<iostream> #include<s

uva 10581 - Partitioning for fun and profit(记忆化搜索+数论)

题目链接:uva 10581 - Partitioning for fun and profit 题目大意:给定m,n,k,将m分解成n份,然后按照每份的个数排定字典序,并且划分时要求ai?1≤ai,然后输出字典序排在k位的划分方法. 解题思路:因为有ai?1≤ai的条件,所以先记忆化搜索处理出组合情况dp[i][j][s]表示第i位为j,并且剩余的未划分数为s的总数为dp[i][j][s],然后就是枚举每一位上的值,判断序列的位置即可. #include <cstdio> #include

洛谷P1057 传球游戏(记忆化搜索)

点我进入题目 题目大意:n个小孩围一圈传球,每个人可以给左边的人或右边的人传球,1号小孩开始,一共传m次,请问有多少种可能的路径使球回到1号小孩. 输入输出:输入n,m,输出路径的数量. 数据范围:40% 3<=n<=30 1<=m<=20 100% 3<=n<=30 1<=m<=30 我是这么想的:膜拟过程,从1号小孩开始dfs,然后加一个记忆化搜索节省时间. dfs(num,tim)表示球传到第num个小孩,已经传过tim次时候,d[num][tim]表

UVA 10798 - Be wary of Roses(记忆化BFS)

UVA 10798 - Be wary of Roses 题目链接 题意:给定一个地图,人一开始在中心,问选择一种走法走出去,使得面朝任何一个方向走,踩到的花的最大值最小 思路:用优先队列进行BFS,每次取出踩到最少的情况,广搜记录状态为当前位置,和4个方向分别踩到的花数 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace

uva 11008 Antimatter Ray Clearcutting(DFS + 记忆化搜索)

uva 11008 Antimatter Ray Clearcutting It's year 2465, and you are the Chief Engineer for Glorified Lumberjacks Inc. on planet Trie. There is a number of trees that you need to cut down, and the only weapon you have is a high-powered antimatter ray th

uva 10285 The Tower of Babylon(记忆化搜索)

Problem C Longest Run on a Snowboard Input: standard input Output: standard output Time Limit: 5 seconds Memory Limit: 32 MB Michael likes snowboarding. That's not very surprising, since snowboarding is really great. The bad thing is that in order to

uva 12163 - Addition-Subtraction Game(组合游戏)

题目链接:uva 12163 - Addition-Subtraction Game 题目大意:两个人进行游戏,对于每一局有一个无向图,给出无向图,每个节点有个K值,两人轮流操作,每次可以选中国一个含有石子的节点,将该节点的一个石子拿掉,然后选择K个有边连接的节点加上一个石子(节点可以重复选择),每个节点的子节点不会超过15个.不能操作的人视为失败.每局有n轮,给定每轮中每个节点上石子的初始值,问先手胜利还是失败. 解题思路:有向图上移动石子的组合游戏,对于没有子节点的节点SG值为0,然后对于每