解题思路:

首先我们以题目的三人传球为例,每个人只能传给自己左右的人,如下图所示:

1.png

在编程的时候,我们把学生序列存储为数组,小蛮在第一个,也就是0位置,数组形式的传球如下图所示:

2.png

每轮传球,球传到序号x的学生手中的可能应该是上一轮传球中他左、右两侧同学拥有球的可能性之和,以3人为例就如下图所示:

3.png

 

 这部分图解还是看不懂的同学,可以再查阅一下“动态规划”的讲解


代码实现:

题目给的n表示学生数量,m表示轮数

但在构建二维数组的时候,应该构建的事a[m+1][n],因为初始状态不算在传递轮数中

然后就是a[i][j]等于多少了,这里要分情况讨论:

我们把圈拆成了数组,因此首、尾需要不同的处理方式表示其左右的同学,具体详见如下代码:

for(int i=1;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(j==0) //第一个同学
{
a[i][j]=a[i-1][1]+a[i-1][n-1];
}
else if(j==n-1) //最后一个同学
{
a[i][j]=a[i-1][0]+a[i-1][n-2];
}
else //中间的同学
{
a[i][j]=a[i-1][j-1]+a[i-1][j+1];
}
}
}

参考代码:

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
m++;
int [][]a=new int[m][n]; //存储第m轮各同学拿到球的可能性

for(int i=1;i<m;i++) //二维数组初始化
{
for(int j=0;j<n;j++)
{
a[i][j]=0;
}
}
a[0][0]=1; //小蛮初始就拿到了球
for(int i=1;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(j==0) //第一个同学
{
a[i][j]=a[i-1][1]+a[i-1][n-1];
}
else if(j==n-1) //最后一个同学
{
a[i][j]=a[i-1][0]+a[i-1][n-2];
}
else //中间的同学
{
a[i][j]=a[i-1][j-1]+a[i-1][j+1];
}
}
}

System.out.println(a[m-1][0]); //小蛮
}
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论