• 博弈论问题


    对钟长者的课堂总结QwQ


    类型一:一人进行一件事回合制游戏(例如取k样东西,走k步)

    解题方法:设dp[i][j][k]...(表示状态)表示在此状态是必胜态还是必败态

    然后看这个状态可以转移到那几个状态,如果此状态转移到的所有状态均为必胜态

    则此状态为必败态,若此状态的所有转移中有一个为必败态,则此状态为必胜态。

    例一:有n件物品,Alice和Bob在进行游戏,Alice为先手,对于每回合,Alice和Bob

    可以取走2-5件物品,Alice和Bob均使用最优策略,问Alice是必胜还是必败。

    设dp[i]表示到第i件物品时是必胜态(true)还是必败态(false)。

    由Alice为先手,每回合可以取走2-5件物品可知,dp[1]=false;

    dp[2]=dp[3]=dp[4]=dp[5]=true;

    然后遍可以从6-n进行O(4*n)的转移,检验dp[i-2],dp[i-3],dp[i-4],dp[i-5]的值,

    如果四个值均为true,则说明无论这个时候怎么取,他的对手在下一轮一定是必胜态,

    所以这个时候是必败态,如果四个值里面有大于等于1个false,则证明此时可以用最优策略

    转移到对手的那轮是必败态,所以这个时候是必胜态。

    例二:

    类型2:Nim石子游戏

    有n堆石子,每堆石子有a[i]个,

    lice和Bob在进行游戏,Alice为先手,对于每回合,Alice和Bob可以从某一堆取走任意数量的石子,

    谁先将石子取完谁获胜。

    Sg定理:因为每堆石子是独立的,所以有一个叫Sg定理的东西。

    定义:sg[i]=mex(sg[它能转移到的状态]),mex:最小的没有出现过的自然数。

    最后可以得到sg[a[i]]每一堆的sg值,最后必胜必败态即为ans=sg[a[1]]^sg[a[2]]^....^sg[a[n]];

    对于Nim石子游戏我们发现,对于第i堆石子的sg值一定为a[i],因为可以取走任意数量的石子嘛,

    最后将所有的a[i]异或起来,如果为0,则先手必败,否则先手必胜。

    例1:有n+1堆石子,最左边一堆有2012个石子,两个人分别进行操作。一次操作可以选取两

    堆不同的石堆,分别增加一个或减少一个石子(一加一减,或给已经不剩石子的堆加一个都是允许的)

    为了保证游戏在有限步内结束,规定所选的两堆中右边的那一堆一定要包含奇数个石子,无路可走者输,

    问先手是否必胜。

    转化为Nim石子游戏问题,

  • 相关阅读:
    Android 程序架构: MVC、MVP、MVVM、Unidirectional、Clean...
    asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
    反射中使用 BindingFlags.IgnoreCase
    JQuery判断数组中是否包含某个元素$.inArray("js", arr);
    Sql日期时间格式转换
    c#组元(Tuple)的使用
    逆向最大匹配分词算法C#
    [WEB API] CLIENT 指定请求及回应格式(XML/JSON)
    Jquery 将表单序列化为Json对象
    JS调试加断点
  • 原文地址:https://www.cnblogs.com/Hoyoak/p/11780768.html
Copyright © 2020-2023  润新知