记忆化搜索(游戏NOIP17提高模拟训练11)

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

时间限制:

2S

空间限制:

256M

思路就是记忆化搜索,每一次标记一下是谁下这个点。可以预处理一下数据,加快运行的速度。

#include<bits/stdc++.h>
using namespace std;

int Map[2000][2000],hang[2000][2000],lie[2000][2000];
bool book [2000][2000][2];
bool dp[2000][2000][2];
int n;

bool dfs(int i,int j,bool point)
{
    if(i==0||j==0) return 0;
    if(book[i][j][point]) return dp[i][j][point];
    if(hang[i][j]%2==0) dp[i][j][point]=!dfs(i-1,j,point^1);
    if(lie[i][j]%2==0)
    {
        if(!dfs(i,j-1,point^1)||dp[i][j][point])
            dp[i][j][point]=1   ;
        else dp[i][j][point]=0;
    }
    book[i][j][point]=1;
    return dp[i][j][point];
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(Map,0,sizeof(Map));memset(lie,0,sizeof(lie));memset(dp,0,sizeof(dp));memset(hang,0,sizeof(hang));
        memset(book,0,sizeof(book));
        cin>>n;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                cin>>Map[i][j];
                hang[i][j]=hang[i][j-1]+Map[i][j];
            }
        for(int j=1;j<=n;j++)
            for(int i=1;i<=n;i++)
                lie[i][j]=lie[i-1][j]+Map[i][j];

        if(dfs(n,n,0))cout<<"W\n";
        else cout<<"L\n";
    }
    return 0;
}

  

时间: 2024-08-06 19:27:23

记忆化搜索(游戏NOIP17提高模拟训练11)的相关文章

模拟 (NOIP17提高模拟训练11六边形)

棋盘是由许多个六边形构成的,共有5种不同的六边形编号为1到5,棋盘的生成规则如下:1.从中心的一个六边形开始,逆时针向外生成一个个六边形.2.对于刚生成的一个六边形,我们要确定它的种类,它的种类必须满足与已生成的相邻的六边形不同.3.如果有多个种类可以选,我们选择出现次数最少的种类.4.情况3下还有多个种类可以选,我们选择数字编号最小的.现在要你求第N个生成的六边形的编号?前14个六边形生成图如下: 输入格式: 第一行:T,表示数据组数接下来T行,每行一个数:N,表示第N个六边形 输出格式: 共

数列(NOIP17提高模拟训练11)

给你一个长度为N的正整数序列,如果一个连续的子序列,子序列的和能够被K整除,那么就视此子序列合法,求原序列包括多少个合法的连续子序列?对于一个长度为8的序列,K=4的情况:2, 1, 2, 1, 1, 2, 1, 2 .它的答案为6,子序列是位置1->位置8,2->4,2->7,3->5,4->6,5->7. 输入格式: 第一行:T,表示数据组数对于每组数据:第一行:2个数,K,N第二行:N个数,表示这个序列 输出格式: 共T行,每行一个数表示答案 样例输入: 2 7

洛谷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]表

Codevs_1017_乘积最大_(划分型动态规划/记忆化搜索)

描述 http://codevs.cn/problem/1017/ 给出一个n位数,在数字中间添加k个乘号,使得最终的乘积最大. 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友

hdu 1978 记忆化搜索

How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5203    Accepted Submission(s): 3067 Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下:1.机器人一开始在棋盘的起始点并有起

hdu1978(记忆化搜索)

How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2762    Accepted Submission(s): 1630 Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下:1.机器人一开始在棋盘的起始点并有起

【noip 2009】 乌龟棋 记忆化搜索&amp;动规

题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前

poj 1085 Triangle War (状压+记忆化搜索)

Triangle War Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2685   Accepted: 1061 Description Triangle War is a two-player game played on the following triangular grid: Two players, A and B, take turns filling in any dotted line connect

vijos - P1456最小总代价 (状态压缩DP + 记忆化搜索)

P1456最小总代价 Accepted 标签:[显示标签] 描述 n个人在做传递物品的游戏,编号为1-n. 游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位:下一个人可以传递给未接过物品的任意一人. 即物品只能经过同一个人一次,而且每次传递过程都有一个代价:不同的人传给不同的人的代价值之间没有联系: 求当物品经过所有n个人后,整个过程的总代价是多少. 格式 输入格式 第一行为n,表示共有n个人(16>=n>=2): 以下为n*n的矩阵,第i+1行.第j列表示物