记忆化搜索-传球游戏

题目描述 Description

上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。

游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。

聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球的方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。

输入描述 Input Description

共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30)。

输出描述 Output Description

共一行,有一个整数,表示符合题意的方法数。

样例输入 Sample Input

3 3

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

40%的数据满足:3<=n<=30,1<=m<=20

100%的数据满足:3<=n<=30,1<=m<=30

//数据有点大,所以通过数组记录来优化它,但要判断清楚

代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int huan[1000][1000],sc[1000][1000],tot,n,m;
int search(int i,int j){
if(j==0) j=n;
if(j==n+1) j=1;
if(i>m) return 0;
if(huan[i][j]==1) return sc[i][j];
huan[i][j]=1;
return sc[i][j]=search(i+1,j-1)+search(i+1,j+1);
}
int main()
{
cin>>n>>m;
huan[m][1]=1,sc[m][1]=1;
sc[0][1]=search(1,2)+search(1,n);
cout<<sc[0][1]<<endl;
}

时间: 2024-10-13 18:03:16

记忆化搜索-传球游戏的相关文章

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

Alice和Bob在玩一个游戏,游戏是在一个N*N的矩阵上进行的,每个格子上都有一个正整数.当轮到Alice/Bob时,他/她可以选择最后一列或最后一行,并将其删除,但必须保证选择的这一行或这一列所有数的和为偶数.如果他/她不能删除最后一行或最后一列,那么他/她就输了.两人都用最优策略来玩游戏,Alice先手,问Alice是否可以必胜? 输入格式: 第一行:T,表示数据组数对于每组数据的第一行:N接下来N行,每行N个数,描述这个矩阵 输出格式: 如果Alice必胜输出W,否则输出L 样例输入:

洛谷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 - 10118Free Candies(记忆化搜索)

题目:UVA - 10118Free Candies(记忆化搜索) 题目大意:给你四堆糖果,每个糖果都有颜色.每次你都只能拿任意一堆最上面的糖果,放到自己的篮子里.如果有两个糖果颜色相同的话,就可以将这对糖果放进自己的口袋.自己的篮子最多只能装5个糖果,如果满了,游戏就结束了.问你能够得到的最多的糖果对数. 解题思路:这题想了好久,好不容易把状态想对了,结果脑子发热,又偏离了方向.dp[a][b][c][d]:四堆糖果现在在最上面的是哪一个.因为下面的糖果如果确定了,那么接下了不管你怎么取,最优

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.机器人一开始在棋盘的起始点并有起

【BZOJ-3895】取石子 记忆化搜索 + 博弈

3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] Description Alice和Bob两个好朋含友又开始玩取石子了.游戏开始时,有N堆石子 排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个: ·从某堆石子中取走一个 ·合并任意两堆石子 不能操作的人输.Alice想知道,她是否能有必胜策略. Input 第一行输入T

CoderForces 280B(记忆化搜索)

题目大意:一个纸牌游戏,52张纸牌排成一列,每张纸牌有面值和花色两种属性.每次操作可以用最后一张纸牌将倒数第二张或者倒数第四张替换,但前提是两张牌的花色或者面值相同.问最终能否只剩一张牌. 题目分析:取当前所剩纸牌张数和最后三张牌作为状态,显然深搜要超时.记忆化搜索即可. 代码如下: # include<iostream> # include<string> # include<cstdio> # include<cstring> # include<

How many ways(记忆化搜索)

How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4275    Accepted Submission(s): 2499 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四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前