思路:
假设该同学是第一个同学(第几个都一样啦)
用f[i][j]来表示第i次传球后j同学得到球的可能性
答案为f[m][1]
转移:
由于每次可以给左边(即f[i+1][j-1])或右边(即f[i+1][j+1])传球
所以对于j来说,f[i-1][j-1]和f[i-1][j+1]都可能给他传球
然后转移方程就出来啦!
f[i][j]=f[i-1][j-1]+f[i-1][j+1]
别急着写!还是有注意事项哒!
·是由1同学发的球(前面有提,是假设啦),所以f[0][1]为1(注意是f[0][1],f[1][1]就是第一次传球后啦)
·整个传球都是在圆桌边进行的,f[i][1]=f[i-1][n]+f[i-1][2](第一个人是可以由最后一个人传过来的)
同理可得f[i][n]=f[i-1][1]+f[i-1][n-1](最后一个人是可以由第一个人传过来的)
让后就是代码时间~
#include<bits/stdc++.h>
using namespace std;
int f[35][35],n,m;
int main(){
cin>>n>>m;
f[0][1]=1;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(j==1)
f[i][j]=(f[i-1][n]+f[i-1][j+1]);
else if(j==n)
f[i][j]=(f[i-1][1]+f[i-1][j-1]);
else
f[i][j]=(f[i-1][j-1]+f[i-1][j+1]);
}
}
cout<<f[m][1];
}