题目描述:
上体育课时,小蛮的老师经常带同学一起玩游戏。这次,他们又在玩传球游戏。
游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,可以向左右传球,当老师吹哨时停下,拿球的同学要给大家表演节目,小蛮想知道,当传球m次时,有多少种不同的传球方法可以使得从小蛮手里的球又回到小蛮手里。
输入:
共一行,包含两个用空格隔开的整数n,m。
输出:
共一行,一个整数,表示符合题意的方法数。
样例:
3 3
2
思路:
首先,看到这道题的数据大小,我第一瞬间就想到了直接进行搜索,然后求出所有状态,没想太多便开始实践,但由于数据可能会爆,所以我选择了记忆化搜索,记录之前已经搜过的步骤。下面是代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int n,m,a[40][40];
bool is[40][40];
long long pass(int now,int rest)
{
if(is[now][rest]){
return a[now][rest];
}
if(now > n){
now = 1;
}
else if(now < 1){
now = n;
}
if(rest == 0){
if(now == 1){
a[now][rest] = 1;
return a[now][rest];
}
return 0;
}
is[now][rest] = true;
a[now][rest] = pass(now-1,rest-1)+pass(now+1,rest-1);
return a[now][rest];
}
int main()
{
cin >> n >> m;
cout << pass(1,m);
return 0;
}
这便是这道题的过程