首页 > 洛谷P1057 传球游戏(记忆化搜索)

洛谷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]表示球传到第num个小孩,已经传过tim次时候已经记录过的可能传到1号小孩的次数。

刚开始的时候默认1号小孩只把球传给2号小孩,因为传给n号小孩和传给2号小孩的情况是对称的,所以乘以2,理论上节省一半时间(实际上由于记忆化搜索,节省不了多少时间)

代码如下:

/*
P1057 传球游戏
*/
#include 
#include 
using namespace std;
int n,m;
int d[31][31];
int search(int num,int tim)
{if(tim==m){if(num==1)return 1;else return 0;}else if(d[num][tim]!=-1)return d[num][tim];else return d[num][tim]=search(num==n?1:num+1,tim+1)+search(num==1?n:num-1,tim+1);
}
int main()
{memset(d,-1,sizeof(d));cin >> n >> m;cout << search(2,1)*2 << endl;return 0;
}

 

转载于:https://www.cnblogs.com/oier/p/7076623.html

更多相关:

  • 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 注意: num 的长度小于 10002 且 ≥ k。 num 不会包含任何前导零。 示例 1 : 输入: num = “1432219”, k = 3 输出: “1219” 解释: 移除掉三个数字 4, 3, 和 2形成一个新的最小的数...

  • 代码展示:   http://paste.ubuntu.com/23693598/ #include #include #include char * largeDiffer(char *a,char *b){ /*  使用说明 传入的a和b只能为整数 结果为a-b;返回...

  • Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of Ch...

  • /*Name: NYOJ--811--变态最大值Author: shen_渊 Date: 17/04/17 15:49Description: 看到博客上这道题浏览量最高,原来的代码就看不下去了 o(╯□╰)o */#include #include #include u...

  • 生成唯一号:思路,根据yymmddhhmmss+自增长号+唯一服务器号( SystemNo)生成唯一码,总长度19,例如:1509281204550000101. public class UniqueNumber {     private static long num = 0;//流水号     private sta...