[递推]D. 【例题4】传球游戏

D . 【 例 题 4 】 传 球 游 戏 D. 【例题4】传球游戏 D.4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


题目解析

t ( i , j ) t(i,j) t(i,j)为过了 j j j轮,轮到 i i i手上的总方案数,而小蛮的编号这里设为 t ( 1 , j ) t(1,j) t(1,j).

因为如果只有 1 1 1人,那么可以得出:
t ( 1 , 0 ) = 1                 t(1,0)=1~~~~~~~~~~~~~~~ t(1,0)=1               (不经过任何传递 )

同题目所述,是可以向左和右传递,那么就可以得出递推式
t ( i , j ) = t ( i − 1 , j − 1 ) + t ( i + 1 , j − 1 ) t(i,j)=t(i-1,j-1)+t(i+1,j-1) t(i,j)=t(i1,j1)+t(i+1,j1)

j − 1 j-1 j1是因为少了由 i − 1 i-1 i1 i + 1 i+1 i+1 i i i的轮数.

但是,这是一个环,我们要考虑边界问题:
所以当 i = n i=n i=n时,就是由 t ( i − 1 , j − 1 ) , t ( 1 , j − 1 ) t(i-1,j-1),t(1,j-1) t(i1,j1),t(1,j1)传递来的
同理,当 i = 1 i=1 i=1时,就是由 t ( n , j − 1 ) , t ( i + 1 , j − 1 ) t(n,j-1),t(i+1,j-1) t(n,j1),t(i+1,j1)传递来的

那么就能得出递推式(边界问题略):
t ( i , j ) = { t ( 1 , 0 ) = 1 t ( i , j ) = t ( i − 1 , j − 1 ) + t ( i + 1 , j − 1 ) ; t(i,j) = \left\{\begin{matrix} & t(1,0)=1\\ & t(i,j)=t(i-1,j-1)+t(i+1,j-1);\\ \end{matrix}\right. t(i,j)={t(1,0)=1t(i,j)=t(i1,j1)+t(i+1,j1);


Code

注意循坏变量!与解析相反!

#include <bits/stdc++.h>
#define ll long long
using namespace std;

int n, m;
ll t[35][35];

int main ()
{
	scanf ("%d%d", &n, &m);
	t[1][0] = 1; // 不经过任何传递 
	for (int i = 1; i <= m; ++ i) 
	{
		for (int j = 1; j <= n; ++ j)
		{
			int a = j - 1, b = j + 1; 
			if (j == 1) a = n; // 边界 
			if (j == n) b = 1; // 边界 
			t[j][i] = t[a][i - 1] + t[b][i - 1]; // 递推式 
		}
	}
	printf ("%lld ", t[1][m]);
	return 0;	
} 
posted @ 2020-12-24 16:16  unknown_future  阅读(102)  评论(0编辑  收藏  举报