D


私信TA

用户名:ALS1111

访问量:22107

签 名:

等  级
排  名 55
经  验 11377
参赛次数 0
文章发表 132
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

python-乘积最大
浏览:223
python-回文数
浏览:206
python-摆花摆花
浏览:143

解题思路:

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

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

这里也简单写以下思路吧

首先建立一个(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 人评分

  评论区

  • «
  • »