博弈论(二)

简介: 复习acwing算法基础课的内容,本篇为讲解数学知识:博弈论,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。

AcWing 893. 集合-Nim游戏

本题链接:AcWing 893. 集合-Nim游戏

本博客提供本题截图:

image.png

本题分析

1.Mex运算:

设S表示一个非负整数集合.定义mex(S)为求出不属于集合S的最小非负整数运算,即:

mes(S)=min{x};

例如:S={0,1,2,4},那么mes(S)=3;


2.SG函数

在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,····yk,定义SG(x)的后记节点y1,y2,····

yk的SG函数值构成的集合在执行mex运算的结果,即:

SG(x)=mex({SG(y1),SG(y2)····SG(yk)})


AC代码

#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_set>
using namespace std;
const int N = 110, M = 10010;
int n, m;
int s[N], f[M];
int sg(int x)
{
    if (f[x] != -1) return f[x];
  //记忆化搜索,因为取石子数目的集合是已经确定了的,所以每个数的sg值也都是确定的,如果存储过了,直接返回即可
    unordered_set<int> S;
    //注意,因为是在函数内部定义的set,所以每次递归中的S是不一样的
    for (int i = 0; i < m; i ++ )
    {
        int sum = s[i];
        if (x >= sum) S.insert(sg(x - sum));
        //先遍历至终点,然后倒推求sg
    }
    for (int i = 0; ; i ++ )
        if (!S.count(i))
            return f[x] = i;
}
int main()
{
    cin >> m;
    for (int i = 0; i < m; i ++ ) cin >> s[i];
    cin >> n;
    memset(f, -1, sizeof f);
    int res = 0;
    for (int i = 0; i < n; i ++ )
    {
        int x;
        cin >> x;
        res ^= sg(x);
    }
    if (res) puts("Yes");
    else puts("No");
    return 0;
}

AcWing 894. 拆分-Nim游戏

本题链接:AcWing 894. 拆分-Nim游戏

本博客提供本题截图:

image.png

本题分析

本题相比于上一题,为一个情况拆分成了多个的小情况,根据sg函数,我们需要存储的状态为sg(i) ^ sg(j)

AC代码

#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_set>
using namespace std;
const int N = 110;
int n;
int f[N];
int sg(int x)
{
    if (f[x] != -1) return f[x];
  //记忆化搜索
    unordered_set<int> S;
    for (int i = 0; i < x; i ++ )
        for (int j = 0; j <= i; j ++ )//规定j不大于i,避免重复
            S.insert(sg(i) ^ sg(j));
    for (int i = 0;; i ++ )
        if (!S.count(i))
            return f[x] = i;
}
int main()
{
    cin >> n;
    memset(f, -1, sizeof f);
    int res = 0;
    while (n -- )
    {
        int x;
        cin >> x;
        res ^= sg(x);
    }
    if (res) puts("Yes");
    else puts("No");
    return 0;
}

三、时间复杂度

关于博弈论各步操作的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。



目录
相关文章
|
监控 Unix Linux
Linux命令行教程:使用head和tail命令快速查看文件的开头和结尾
Linux命令行教程:使用head和tail命令快速查看文件的开头和结尾
861 1
|
10月前
|
机器学习/深度学习 人工智能 运维
使用AI进行系统调优:给系统装上“智能大脑”
使用AI进行系统调优:给系统装上“智能大脑”
421 10
|
11月前
|
计算机视觉
RT-DETR改进策略【卷积层】| ICCV-2023 引入Dynamic Snake Convolution动态蛇形卷积,改进ResNetLayer
RT-DETR改进策略【卷积层】| ICCV-2023 引入Dynamic Snake Convolution动态蛇形卷积,改进ResNetLayer
340 15
RT-DETR改进策略【卷积层】| ICCV-2023 引入Dynamic Snake Convolution动态蛇形卷积,改进ResNetLayer
|
编解码 人工智能 自然语言处理
Ruyi:图森未来推出的图生视频大模型,支持多分辨率、多时长视频生成,具备运动幅度和镜头控制等功能
Ruyi是图森未来推出的图生视频大模型,专为消费级显卡设计,支持多分辨率、多时长视频生成,具备首帧、首尾帧控制、运动幅度控制和镜头控制等特性。Ruyi基于DiT架构,能够降低动漫和游戏内容的开发周期和成本,是ACG爱好者和创作者的理想工具。
805 33
Ruyi:图森未来推出的图生视频大模型,支持多分辨率、多时长视频生成,具备运动幅度和镜头控制等功能
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
揭示Transformer周期建模缺陷!北大提出新型神经网络FAN,填补周期性特征建模能力缺陷
北京大学研究团队发现,Transformer等主流神经网络在周期特征建模方面存在缺陷,如记忆数据模式而非理解内在规律,导致泛化能力受限。为此,团队提出基于傅里叶分析的Fourier Analysis Network(FAN),通过显式建模周期性特征,提升模型的理解和预测能力,减少参数和计算量,并在多个实验中验证其优越性。论文链接:https://arxiv.org/pdf/2410.02675.pdf
323 3
|
安全 开发者 Python
Python的内存管理pymalloc
Python的内存管理pymalloc
|
数据采集 SQL Java
TDengine在设备管理系统中应用
这篇文章介绍了TDengine时序数据库在设备管理系统中的应用,包括处理大规模数据插入、查询优化以及如何通过超级表管理多设备数据的具体实践。
296 0
|
自然语言处理
NLP中的知识蒸馏
模型参数量决定其捕获知识的能力,但非线性关系;相同参数量的模型因训练方法差异,如早停法,捕获知识不同。知识蒸馏通过老师模型指导学生模型,利用软标签传递更多信息,提高学生模型性能。温度调控softmax输出,平衡信息获取与噪声抑制,小模型适合较低温度以聚焦关键知识。
312 0
NLP中的知识蒸馏
|
监控 前端开发 JavaScript
浏览器节能机制导致Websocket断连的坑
浏览器节能机制导致Websocket断连的坑
294 0
|
内存技术
No.1 STM32F429IGT6开发板简介 (STM32F429/F767/H743)
No.1 STM32F429IGT6开发板简介 (STM32F429/F767/H743)