洛谷P1057 传球游戏(记忆化搜索)
生活随笔
收集整理的這篇文章主要介紹了
洛谷P1057 传球游戏(记忆化搜索)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
點(diǎn)我進(jìn)入題目
題目大意:n個小孩圍一圈傳球,每個人可以給左邊的人或右邊的人傳球,1號小孩開始,一共傳m次,請問有多少種可能的路徑使球回到1號小孩。
輸入輸出:輸入n,m,輸出路徑的數(shù)量。
數(shù)據(jù)范圍:40% 3<=n<=30 1<=m<=20 100% 3<=n<=30 1<=m<=30
我是這么想的:膜擬過程,從1號小孩開始dfs,然后加一個記憶化搜索節(jié)省時間。
dfs(num,tim)表示球傳到第num個小孩,已經(jīng)傳過tim次時候,d[num][tim]表示球傳到第num個小孩,已經(jīng)傳過tim次時候已經(jīng)記錄過的可能傳到1號小孩的次數(shù)。
剛開始的時候默認(rèn)1號小孩只把球傳給2號小孩,因?yàn)閭鹘on號小孩和傳給2號小孩的情況是對稱的,所以乘以2,理論上節(jié)省一半時間(實(shí)際上由于記憶化搜索,節(jié)省不了多少時間)
代碼如下:
/*
P1057 傳球游戲
*/
#include <iostream>
#include <cstring>
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;
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/oier/p/7076623.html
總結(jié)
以上是生活随笔為你收集整理的洛谷P1057 传球游戏(记忆化搜索)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 甲状腺功能检查费用是多少
- 下一篇: 让小球跳起来