原题链接:蓝桥杯算法训练VIP-传球游戏
解题思路:
本题有两种解法:递归法和动态规划法, 但思路上一致:
第m次到达第i号人的情况 = 第(m-1)次到达第(i+n+1)%n号人的情况 + 第(m-1)次到达第(i+n-1)%n号人的情况
代码中提供了两种解法的代码,递归法超时,使用动态规划用空间换时间,可以AC本题。
注意事项:
参考代码:
import java.util.Scanner; public class C1610 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int rs = F(sc.nextInt(), sc.nextInt()); System.out.println(rs); } sc.close(); } //递归解法(超时):n个人第m次传球时球所在的位置 /*private static int F(int n, int m, int i){ if(m == 1){ if(i == 1 || i == n-1) return 1; else return 0; }else{ return F(n, m-1, (i+n+1)%n) + F(n, m-1, (i+n-1)%n); } }*/ //动态规划解法: a[i][j]表示第i(0~m-1)次传球传到第j(0~n-1)个人手里的可能性 private static int F(int n, int m){ int[][] a = new int[m][n]; //第一行: 只传一次的情况, 只有索引为1和n-1位置才能接到球 for(int j = 0; j < n; j++){ if(j == 1 || j == n-1) a[0][j] = 1; } for(int i = 1; i < m; i++){ for(int j = 0; j < n; j++){ a[i][j] = a[i-1][(j+n+1)%n] + a[i-1][(j+n-1)%n]; } } return a[m-1][0]; } }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复