1. 程式人生 > >【洛谷P1057】傳球遊戲【DP】

【洛谷P1057】傳球遊戲【DP】

題目大意:

nn個人圍成一圈,每次每個人可以把球傳給左右的兩個人。求一開始在11號手上。求經過mm次傳球球又在11號手上的方案數。

思路:

NOIP前抱佛腳 很明顯的設拿著球的人和傳球次數為階段。那麼就可以設f[i][j]f[i][j]表示球在第ii個人手上,傳了jj次球的方案數。那麼由於只能從i1i-1i+1i+1兩個人手中傳過來,那麼很明顯就有 f[i][j]=f[i1][j1]+f[i+1][j1]f[i][j]=f[i-1][j-1]+f[i+1][j-1] 注意處理邊界情況。 時間複雜度:O

(nm)O(nm)

程式碼:

#include <cstdio>
using namespace std;

int n,m,f[50][50];

int main()
{
	scanf("%d%d",&n,&m);
	f[1][0]=1; //初始化,一開始球在1號手上,傳了0次球
	for (int j=1;j<=m;j++)
	 for (int i=1;i<=n;i++)
	  f[i][j]=f[(i-1==0)?n:i-1][j-1]+f[(i+1>n)?1:i+1][j-1];  //三木運算子處理邊界
	printf("%d\n",f[
1][m]); return 0; }