【题解】游戏 (2019.08.01纪中【NOIP提高组】模拟 B 组T1) DP 博弈论

2023-11-01

题目来源:中山纪念中学

题目描述:

Alice和Bob在玩一个游戏,游戏是在一个N*N的矩阵上进行的,每个格子上都有

一个正整数。当轮到Alice/Bob时,他/她可以选择最后一列或最后一行,并将其删除,但

必须保证选择的这一行或这一列所有数的和为偶数。如果他/她不能删除最后一行或最后一

列,那么他/她就输了。两人都用最优策略来玩游戏,Alice先手,问Alice是否可以必胜?

输入:

第一行:T,表示数据组数

对于每组数据的第一行:N

接下来N行,每行N个数,描述这个矩阵

输出:

如果Alice必胜输出W,否则输出L

输入样例

2
2
2 4
6 8
3
5 4 2
1 5 9
7 3 8

输出样例:

L
W

数据范围:

100%数据满足

1<=N<=1000

保证每一行或每一列的和不会超过2*10^9

1<=T<=5

30%数据满足

1<=N<=5

50%数据满足

1<=N<=100

70%数据满足

1<=N<=500

思路:

暴力做法:模拟 50分
1、用a数组存原矩阵,用b数组存原矩阵“列“”的前缀和,用c数组存原矩阵“行”的前缀和,方便快速判断某一列或某一行可不可以删除
2、从右下角开始模拟删除,如果当前行或当前列可以删除,累加删除次数,否则return
3、如果删除次数是奇数,则Alice必输,如果是偶数则必赢

50分代码:
#include<bits/stdc++.h>
using namespace std;
long long t,n,a[1001][1001],b[1001][1001],c[1001][1001],pd=1;
void search(int i,int j)
{
	if (b[i][j]%2!=0&&c[i][j]%2!=0||i==0||j==0) return;
	if (b[i][j]%2==0) pd++,search(i-1,j);
	if (c[i][j]%2==0) pd++,search(i,j-1);
}
int main()
{
	pd=1;
	cin>>t;
	for (int k=1;k<=t;k++)
	{
		cin>>n;
		for (int i=0;i<=n;i++)
		for (int j=0;j<=n;j++) b[i][j]=0,c[i][j]=0;
		for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
		{
			cin>>a[i][j];
			b[i][j]=b[i][j-1]+a[i][j];
			c[i][j]=c[i-1][j]+a[i][j];
		}
		search(n,n);
		if (pd%2!=0) cout<<"L"<<endl;
		else cout<<"W"<<endl;
	}
	return 0;
}

正解:DP 100分
听说这是博弈论?噢~原来这就是博弈论
f[i][j]表示从右下角为i,j坐标开始删除Alice先手的输赢状况,1为必赢,0为必输,我们只要把对方置为必输状况就可以赢了,判断当前输赢状况分三种情况
1、当f[i][j]左边和上边都是必赢时,无论当前怎么删,到了对方就是必赢,所以我方必输
2、当只有一个是必赢时,判断可否删除必赢的那一行或列,将对手置于必输状况,如果可以删除,那么当前位置就必赢
3、当两个都必输时,任意删除偶数行或偶数列,都可以将对手置于必输状况,如果都删不了,那么就必输
如果还是不太理解的话,可以将f数组画出来,以第二个矩阵为例子:
在这里插入图片描述

最后的f[n][n]为1,必赢,所以输出W

AC代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,a[1001][1001],b[1001][1001],c[1001][1001],f[1001][1001];
int main()
{
    cin>>t;
    for (int k=1;k<=t;k++)
    {
        cin>>n;
        for (int i=0;i<=n;i++)
        for (int j=0;j<=n;j++) f[i][j]=0,b[i][j]=0,c[i][j]=0;  
        for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
        {
            cin>>a[i][j];
            b[i][j]=b[i][j-1]+a[i][j];
            c[i][j]=c[i-1][j]+a[i][j];//前缀和
        }   
        if (a[1][1]%2==0) f[1][1]=1; else f[1][1]=0; //初始化 
        for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
        {
            if (f[i-1][j]==0&&f[i][j-1]==0)
              if (b[i][j]%2==0||c[i][j]%2==0) f[i][j]=1;//只要前两个都是零并且可以删,那么这个位置必赢 
            if (f[i-1][j]==0&&f[i][j-1]==1)
              if (b[i][j]%2==0) f[i][j]=1;
            if (f[i-1][j]==1&&f[i][j-1]==0)
              if (c[i][j]%2==0) f[i][j]=1;  //前两个一个0一个1,对应的可以删就必赢 
        }  
        if (f[n][n]==1) cout<<"W"<<endl; //最后是1,必赢 
        else cout<<"L"<<endl;
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【题解】游戏 (2019.08.01纪中【NOIP提高组】模拟 B 组T1) DP 博弈论 的相关文章

  • 2023华为OD机试真题Java实现【士兵过河/动态规划】

    题目内容 一支N个士兵的军队正在趁夜色逃亡 途中遇到一条湍急的大河 敌军在T的时长后到达河面 没到过对岸的士兵都会被消灭 现在军队只找到了1只小船 这船最多能同时坐上2个士兵 1 当1个士兵划船过河 用时为 a i 0 lt i lt N
  • LeetCode:动态规划中的子序列问题

    PS 本文是参考代码随想录做的一些笔记 完整版本请戳链接 非常好的教程 本文列举了一些经典题目 特别是编辑距离 基本上的题目解题思路都是一样的 可以说是一个路子 300 最长递增子序列 给你一个整数数组 nums 找到其中最长严格递增子序列
  • 2023华为OD机试真题(java 100%通过)【最多获得的短信条数/动态规划】

    题目内容 某云短信厂商 为庆祝国庆 推出充值优惠活动 现在给出客户预算 和优惠售价序列 求最多可获得的短信总条数 输入描述 第一行客户预算M 其中 0 M 10 6 第二行给出售价表 P1 P2 Pn 其中 1 n 100 Pi为充值 i
  • 蓝桥杯接龙数列(动态规划)

    蓝桥杯2023年第十四届省赛真题 接龙数列 C语言网 dotcpp com 我们要求最少删除多少个数 可以使剩下的序列是接龙序列 那么找到一条最长的接龙数列即可求出最少删除的个数 运用动态规划的思想 从前往后挨个考虑每个数字 一个前缀为6的
  • LeetCode312. 戳气球 (分治,记忆化搜索,动态规划)

    LeetCode312 戳气球 解题思路 记忆化搜索 动态规划 解题思路 官方题解 参考题解 核心思想 由于戳气球的操作会导致两个气球从不相邻变成相邻 使得后续操作难以处理 于是我们倒过来看这些操作 将全过程看成每次添加一个气球 solve
  • 每日一题:路径计数

    路径计数 题目 Daimayuan Online Judge f i j 表示从左上角走到 i j 的方案数 状态转移 i j 由 i 1 j 和 i j 1 转移而来 初始状态 得使得f 1 1 为1 所以初始化f 1 0 或者f 0 1
  • 博弈论

    文章目录 博弈论 什么是博弈论 博弈的前提 博弈的要素 博弈的分类 非合作博弈 有限两人博弈囚徒困境 合作博弈 无限多人博弈囚徒困境 常见的博弈定律 零和博弈 重复博弈 智猪博弈 斗鸡博弈 猎鹿博弈 蜈蚣博弈 酒吧博弈 枪手博弈 警匪博弈
  • 【类】二维dp:动态规划背包问题

    dp n m 含义就是 当有n种物品时且背包有m容量时 这个背包能产生的最大价值 状态转换关系是 dp n m dp n 1 m dp n 1 m 新物品重量 意思就是 当面对新来的一个物品时 求这个情况下 背包能产生的最大价值 相当于求下
  • 【算法-LeetCode】63. 不同路径 II(动态规划;滚动数组)

    63 不同路径 II 力扣 LeetCode 文章起笔 2021年11月13日16 28 08 问题描述及示例 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达
  • 力扣动态规划专题(一)背包理论基础 基础动规题 动规注意点 步骤及C++实现

    文章目录 动态规划 509 斐波那契数 五步骤 代码 70 爬楼梯 五步骤 代码 746 使用最小花费爬楼梯 五步骤 代码 扩展 62 不同路径 动态规划 数论 63 不同路径 II 五步骤 代码 343 整数拆分 五步骤 代码 96 不同
  • 每日一练——day2

    前言 小亭子正在努力的学习编程 接下来将开启编程题的练习 分享的文章都是学习的笔记和感悟 如有不妥之处希望大佬们批评指正 同时如果本文对你有帮助的话 烦请点赞关注支持一波 感激不尽 第一题 题目描述 链接 https www nowcode
  • HDU-7304 2023“钉耙编程”杭电多校赛(3)Out of Control

    2023 钉耙编程 中国大学生算法设计超级联赛 3 Out of Control 题目大意 有 n n n个数 x 1 x
  • [leetcode] 推多米诺 双指针

    题目链接 一开始想多了 像成了真实生活中的那种会叠加的状态 就比如 RRL 中 左边的两个 R 会让第三个 L 向右边倾斜 直接用前缀和进行操作 但是发现示例1都无法通过 所以说是错的 正确的想法是 每一个暂未确定状态的 都由这个字符两侧最
  • 代码随想录算法训练营第十九天

    动态规划系列5 6 7 8 377 组合总和 未看解答自己编写的青春版 重点 代码随想录的代码 我的代码 当天晚上理解后自己编写 求排列数的题 用二维DP过不了 自己捋逻辑的话 也是可以觉得有漏洞 但是怎么修改 一下子还没思路 包括后面的
  • leetcode刷题(77)——312. 戳气球

    一 题目 有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 每当你戳破一个气球 i 时 你可以获得 nums left nums i nums right 个硬币 这里
  • 字节跳动笔试---字母交换,最多m次

    参考 https blog csdn net cxzzxc123456 article details 79058419 编码题 字符串S由小写字母构成 长度为n 定义一种操作 每次都可以挑选字符串中任意的两个相邻字母进行交换 询问在至多交
  • 蓝桥杯:斐波那契数列最大公约数

    题目表示的很明确 要用两个算法 斐波那契数列是很经典的dp问题 最大公约数是很经典的辗转相除法 从而我理所应当的就定义一个数组存放斐波那契数列 long long int F 2021 0 F 1 1 F 2 1 for int i 3 i
  • 【GPLT】【2022天梯赛真题题解】

    L1 1 今天我要赢 5分 题目描述 2018 年我们曾经出过一题 是输出 2018 我们要赢 今年是 2022 年 你要输出的句子变成了 我要赢 就在今天 然后以比赛当天的日期落款 输入格式 本题没有输入 输出格式 输出分 2 行 在第一
  • 华为od机考真题-数据分类

    while 1 try c b nums list map int input split dp
  • 第14届蓝桥杯C++B组省赛

    文章目录 A 日期统计 B 01 串的熵 C 冶炼金属 D 飞机降落 E 接龙数列 F 岛屿个数 G 子串简写 H 整数删除 I 景区导游 J 砍树 今年比去年难好多 Update 2023 4 10 反转了 炼金二分没写错 可以AC了 U

随机推荐

  • 服务器租用机房机房的类型应该如何选择

    服务器租用机房机房的类型应该如何选择 1 单电信机房 单电信服务器机房业务模式比较固定 访问量也不是很大 适合新闻类网站或政务类网站 如果网站的PV流量持续增加 建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题 2 双线机房
  • 3. 静态编译和动态编译

    简单的说 1 平时直接 gcc o 编译的都是动态编译的方法 2 动态编译是 gcc shared fPIC o 的方法生成 so动态库 再用 gcc o 把 so和main c编译成可执行文件 总结 静态库是必须要链接到执行文件中去的 而
  • 【NLP】第 7 章:使用序列到序列神经网络进行文本翻译

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 设计模式-单例模式-懒汉式饿汉式探讨

    文章目录 基础概念 饿汉式实例 懒汉式实例 懒汉式实例 互斥锁方式保障线程安全 懒汉式实例 双重检查锁定 Double Checked Locking 保障线程安全 大型项目中单例模式实用 数据库连接池 C语言 单例模式实现线程池 C语言单
  • Linux系统下解压当前目录下的所有.zip文件到指定目录

    可以使用以下的命令在Linux系统下解压当前目录下的所有 zip文件到指定目录 find type f name zip exec unzip o d path to destination 解释 find type f name zip
  • matlab读写xlsx文件

    做数据分析时经常需要将分析的结果写入文件保存 这里就说明一下matlab读写xlsx文件的方法 调用函数如下 写文件 files 文件路径 A 数据 sheet xlsx工作表 x1Range 工作表的单元格 files strcat pw
  • [技术讨论]PCB晶振layout需要注意事项

    晶振是单片机的心脏 所以晶振的重要性不言而喻 那么在PCB layout的时候 我们对晶振要有哪些注意事项呢 一 晶振的两个重要参数 晶振的频偏是指晶振输出的频率与其额定频率之间的差异 通常以ppm 百万分之一 为单位表示 频偏可能会受到晶
  • 怎么在云服务器上跑深度学习项目,深度学习训练

    MMCV 是一个面向计算机视觉的基础库 它支持了很多开源项目 注意事项 RTX 3000 系列显卡在 PyTorch 1 8 1 For CUDA 11 1 上 MMCV 目前工作不正常 使用此系列显卡时 请选择 PyTorch 1 7 1
  • C语言循环数组解决数学问题,通过C语言数组解决一些简单的递推数学问题

    通过C语言数组解决一些简单的递推数学问题 c语言是一种十分适合解决数学问题的编程语言 其中数组对于解决递推问题有十分优秀的作用 数组 数组就是变量的集合 是一种指定义变量的方法 一维数组 定义 类型 数组 数量 里的整数表示变量的数量 in
  • 【猿人学WEB题目专解】猿人学第2题

    据说 看我文章时 关注 点赞 收藏 的 帅哥美女们 心情都会不自觉的好起来 前言 作者简介 大家好我是 user from future 意思是 来自未来的用户 寓意着未来的自己一定很棒 个人主页 点我直达 在这里肯定能找到你想要的 专栏介
  • 【计算机视觉

    文章目录 一 ZeroWaste 二 Aircraft Context Dataset 三 BdSLImset Bangladeshi Sign Language Image Dataset 四 COCO Tasks 五 Deep PCB
  • fragment中嵌套viewpager,vierpager中有多个fragment,不显示 .

    http blog csdn net shaoyizhe2006 article details 27352349
  • PID 算法 (温控为例子)

    一 位式控制 位式控制算法输出信号一般只有高低两种状态 算法输出信号out的依据 PV lt SP gt H PV gt SP gt L 对于系统惯性 会导致系统震荡 PID算法 基于位式控制 做了很多优化 SP Set Point PV
  • 《数学建模实战攻略:常用数学理论与方法Matlab》

    一 简介 在数学建模过程中 选择合适的数学理论和方法对于解决问题至关重要 在本篇博客中 我们将介绍数学建模中经常用到的一些数学理论和方法 包括线性代数 微积分 概率论与统计以及优化方法 此外 我们将通过一个简单的示例来展示如何使用MATLA
  • 【纯干货】神奇的Ctrl键,Linux运维常用快捷键!

    Ctrl 可以带来什么意想不到的效果呢 是否所有的Linux运维常用快捷键你都已经掌握了呢 小编发现不少小伙伴们在学习以及Linux运维工作中 操作命令行还在用很土很没效率的方法 例如频繁用方向键移动命令行光标 频繁敲重复的命令等 为了解决
  • HA主备路由模式的原理

    HA是High Availability缩写 即高可用性 可防止网络中由于单个防火墙的设备故障或网络故障导致网络中断 保证网络服务的连续性和安全强度 目前 ha功能已经是防火墙内一个重要组成部分 主备模式 Active standby 在一
  • cerr与cout的区别

    概念 std cerr是ISO C 标准错误输出流 对应于ISO C标准库的stderr 与std cout不同 ISO C 要求当cerr被初始化后 cerr flags unitbuf非零 保证流在每次输出操作后被刷新 且cerr ti
  • Sublime Text的安装与配置记录

    Sublime Text作为一款优质的Code编辑器 已更新至第4个版本 本文记录关于Sublime Text 4 版本4126 的安装 汉化 以及常用配置方法 安装 访问官网下载安装包 https www sublimetext com
  • 如何注册快手引流号?快手引流账号应该注意什么?

    快手短视频的影响力越来越大 用户也是越来越多 一个流量聚焦的平台 通过用户分享自制的短视zhi频形式获取了大量粉丝 而且不屏蔽任何引流信息 可以说是非常开放 自由 快手在短时间内就拥有大量的用户数不得不说它的推广很到位 那么快手账号应该如何
  • 【题解】游戏 (2019.08.01纪中【NOIP提高组】模拟 B 组T1) DP 博弈论

    题目来源 中山纪念中学 题目描述 Alice和Bob在玩一个游戏 游戏是在一个N N的矩阵上进行的 每个格子上都有 一个正整数 当轮到Alice Bob时 他 她可以选择最后一列或最后一行 并将其删除 但 必须保证选择的这一行或这一列所有数