居左


私信TA

用户名:JZ50

访问量:75712

签 名:

楼下你的分数已经再次被超越!!快刷!!

等  级
排  名 34
经  验 14138
参赛次数 2
文章发表 109
年  龄 0
在职情况 学生
学  校 99
专  业

  自我简介:

TA的其他文章

解题思路:


     本题有两种解法:递归法和动态规划法, 但思路上一致:

     第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 人评分

  评论区

  • «
  • »