原题链接:蓝桥杯算法训练VIP-传球游戏
解题思路:
开始我以为是一个递归的题目,写出程序之后数据较大的话时间就会超时。后来参考了别人的答案之后发现是用动态规划的算法。
一楼楼主写的题解很好,大家可以去看看。
这里也简单写以下思路吧
首先建立一个(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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复