[递推]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(i−1,j−1)+t(i+1,j−1)
j − 1 j-1 j−1是因为少了由 i − 1 i-1 i−1或 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(i−1,j−1),t(1,j−1)传递来的
同理,当
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,j−1),t(i+1,j−1)传递来的
那么就能得出递推式(边界问题略):
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(i−1,j−1)+t(i+1,j−1);
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;
}