猿辅导:击鼓传花(动态规划)

题目描述

  学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏。游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击鼓,鼓声开始之后拿着花的同学开始传花,每个同学都可以把花传给自己左右的两个同学中的一个(左右任意),当主持人停止击鼓时,传花停止,此时,正拿着花没传出去的那个同学就要给大家表演一个节目。

  聪明的小赛提出一个有趣的问题:有多少种不同的方法可以使得从小赛手里开始传的花,传了m次以后,又回到小赛手里。对于传递的方法当且仅当这两种方法中,接到花的同学按接球顺序组成的序列是不同的,才视作两种传花的方法不同。比如有3个同学1号、2号、3号,并假设小赛为1号,花传了3次回到小赛手里的方式有1->2->3->1和1->3->2->1,共2种。

输入

输入共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30)
样例输入
3 3

输出

输出共一行,有一个整数,表示符合题意的方法数
样例输出
2

思路1:动态规划

  每个同学都可以把花传给自己左右的两个同学中的一个(左右任意);

  假设同学编号为 1,2,3,4,5…i…n

  正向思考:

    • 第0次,1同学持有花,准备开始抛花。
    • 第1次,同学2接到花 OR 同学n接到花。

  反向思考:

    • 第1个同学,可以收到第2个同学或者第n个同学的花。
    • 第 i 个同学,可以收到第(i-1)个同学或者第(i+1)个同学的花。
    • 第n个同学,可以收到第1个同学或者第(n-1)个同学的花。

  总结:

    • 第 i 次 j 接到花 = 第 i-1 次( j-1)接到花 + 第 i-1 次( j+1)接到花
    • d[i][j] = d[(i-1)][(j-1)%n]+d[(i-1)][(j+1)%n]为了很好的处理首尾两个元素使得环成立,这个公式得根据具体设置的数组进行调整
    • dp[i][j] 表示从初始节点走 i 步到达节点 j 所有的方法数

代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();//表示人数
        int m=sc.nextInt();//表示经过的步数
        int [][] dp=new int[m+1][n];//dp[i][j] 表示从初始节点0走i步到达节点j所有的方法数
        dp[0][0]=1;
        for(int i=1;i<=m;i++){
            for(int j=0;j<n;j++){
                dp[i][j]=dp[(i-1)][(j-1+n)%n]+dp[(i-1)][(j+1+n)%n];
            }
        }
        System.out.println(dp[m][0]);
    }
}

原文地址:https://www.cnblogs.com/haimishasha/p/11296438.html

时间: 2024-10-22 08:55:51

猿辅导:击鼓传花(动态规划)的相关文章

猿辅导:迷宫(动态规划)

题目描述 有一个N*M大小的迷宫矩阵,迷宫中的每个各自都有一个数值(R<10^9).小猿在迷宫中发现,他只能朝着上下左右四个方向的相邻格子前进,并且只能进入比当前位置数值更大的格子.但是小猿有个紧急呼救按钮,它可以通过按下按钮,强行进入到不满足书纸大小要求的相邻格子,可惜这个按钮只能使用K次,请问小猿从这个迷宫任选一个格子出发,在紧急呼救按钮的帮助下,最多能走多少步?(开始位置计入步数,即站在起点是步数为1). 输入描述 第一行输入 N,M,K, 接下来N行,每行M个数,表示每个迷宫中各个格子的

FOJ 1962 新击鼓传花游戏 线段树

维护一个sum数组,有点划分树的思想,写过划分树的应该能看出来 #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<stack> #include<cmath> #include<queue> #include<map> using namespace

《深度学习核心技术与实践》PDF资料分享学习+猿辅导研究团队

<深度学习核心技术与实践>主要介绍深度学习的核心算法,以及在计算机视觉.语音识别.自然语言处理中的相关应用.作者: 猿辅导研究团队 <深度学习核心技术与实践>PDF,530页,带书签目录,文字可以复制. 配套代码和资源链接. 下载:https://pan.baidu.com/s/1EW7HUQVEasu2joovH2m61Q <深度学习核心技术与实践>的作者们都是业界一线的深度学习从业者,所以书中所写内容和业界联系紧密,所涵盖的深度学习相关知识点比较全面.<深度学

2017寒假猿辅导初等数论-3: &quot;素数与惟一分解定理(一)&quot;作业题解答

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程. 1. 证明: 对任意给定的正整数 $n$, 存在无穷多个正整数 $a$, 使 $n^4 + a$ 是合数. 解答: 令 $a = 4m^4$, $m\in\mathbf{Z}$, $$n^4 + 4m^4 = (n^2 + 2m^2)^2 - 4m^2n^2$$ $$= (n^2 + 2m^2 + 2mn)(n^2 + 2m^2 - 2mn)$$ 易知, $m > 1$ 时 $n^2 + 2m^

2017寒假猿辅导初等数论-2: &quot;带余除法&quot;作业题解答

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程. 1. 计算: $(5767, 4453)$, $(3141, 1592)$, $(136, 221, 391)$. 解答: $$(5767, 4453) = (4453, 1314) = (1314, 511) = (511, 292) = (292, 219) = (219, 73) = 73.$$ $$(3141, 1592) = (1592, 1549) = (1549, 43) = (43,

2016猿辅导初中数学竞赛训练营作业题解答-6

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程(14次课, 99元). 1. $(x + y + z)^5 - x^5 - y^5 - z^5$ 解答: $f(x, y, z)$ 是五次齐次对称式. 验证 $$f(-y, y, z) = z^5 + y^5 - y^5 - z^5 = 0$$ 因此 $x+y$, $y+z$, $z+x$ 均为 $f(x, y, z)$ 之因式 (需补充二次齐次对称式因式). 令 $$f(x, y, z) = (x +

2016猿辅导初中数学竞赛训练营作业题解答-13

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程. 1. 一轮船从重庆到上海要 $5$ 昼夜, 从上海到重庆要 $7$ 昼夜, 那么有一个木排从重庆漂到上海要多少昼夜? 解答: 设水流速度为 $x$, 则 $$x = \left(\frac{1}{5} - \frac{1}{7}\right) \div 2 = \frac{1}{35}.$$ 因此需要 $35$ 昼夜. 2. 十时与十一时之间, 两针在什么时刻成直线? 解答: $\Delta S =

2016猿辅导初中数学竞赛训练营作业题解答-5

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程(14次课, 99元). 1. 分解因式 $a^3 - 4a^2 + a + 6$. 解答: 令 $f(a) = a^3 - 4a^2 + a + 6$, 其有理根可能为 $\pm1$, $\pm2$, $\pm3$, $\pm6$. 注意到 $f(a)$ 奇次项与偶次项系数和相等 (等于 $2$), 因此 $f(-1) = 0$. 由综合除法可得: $$a^3 - 4a^2 + a - 6 = (a +

2016猿辅导初中数学竞赛训练营作业题解答-2

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程(14次课, 99元). 分解下列因式: 1. $(2x^2+5x)^2 - 2x^2 - 5x - 6$ 解答: $$(2x^2+5x)^2 - 2x^2 - 5x - 6 = (2x^2+5x)^2 - (2x^2 + 5x) - 6$$ $$= (2x^2 + 5x - 3)(2x^2 + 5x + 2)$$ $$= (2x - 1)(x + 3)(2x + 1)(x + 2).$$ 2. $x^4