解题思路:

开始我以为是一个递归的题目,写出程序之后数据较大的话时间就会超时。后来参考了别人的答案之后发现是用动态规划的算法。

一楼楼主写的题解很好,大家可以去看看。

这里也简单写以下思路吧

首先建立一个(m+1)*n的数组,暂且起名叫stu吧,m是传球次数(开始是0次),n是学生个数。初始化数组中的值全为零。stu[i][j]的值代表的含义是第i次传球后第j个同学拿到球的可能次数。传球0次的时候球在小蛮手中,因此初始化stu[0][1] = 1。接下来我们可以知道,

第i次传球时某个同学可能会从他左边的同学手中接过球,也有可能会从他右边的同学手中接过球。因此我们可以得到公式

stu[i][j] = stu[i-1][j-1]+stu[i-1][j+1]

我们也要考虑特殊的情况

①第i次传球后球在1号同学手中,此时

stu[i][j] = stu[i-1][n]+stu[i-1][j+1]

①第i次传球后球在n号同学手中,此时

stu[i][j] = stu[i-1][j-1]+stu[i-1][1]

接下来大家看代码应该就能理解了。


注意事项:


参考代码:

def f(n,m):  
    stu = [[0 for j in range(n+1)] for i in range(m+1)]  
    stu[0][1] = 1  
  
    for i in range(1,m+1):  
        for j in range(1,n+1):  
            if j == 1:  
                stu[i][j] = stu[i-1][n]+stu[i-1][j+1]  
            elif j == n:  
                stu[i][j] = stu[i-1][j-1]+stu[i-1][1]  
            else:  
                stu[i][j] = stu[i-1][j-1]+stu[i-1][j+1]  
      
    print(stu[m][1])  
      
  
  
if __name__ == '__main__':  
    n,m = map(int,input().strip().split())  
    f(n,m)


点赞(0)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论