动态规划——传球问题

题目链接:1.传球游戏 - 蓝桥云课 (lanqiao.cn)


本题关键在于动态规划的数组设计,以及围坐一圈时索引的变化。

首先是动态规划,由于是求球传递m次回到第一位同学,那么就可以设计成一个二维数组,每个位置代表的是,这是第几次传递,传递到了哪位同学的手上。所以最后只要给出第m次传递,且在0号同学手上的方案数,也就是dp[m][0]。

其中最重要的算法是dp[i][j]+=dp[i-1][(j+1)%n]+dp[i-1][(j-1+n)%n],意思是第i次传递时球在j号同学手上的方案数,他的值等于本次传递是位于他索引下一位的同学传来的和他索引上一位的同学传来的的方案总数,大概思路如图:

(其中,索引的变化可以写作(j+1)%n,(j-1+n)%n,分别表示该索引的下一位和上一位,对n取模是为了让索引可以循环出现,如还不懂,可以通过加深印象,记住就好了)

java 复制代码
package lanqiao;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 2023/11/30
 */
public class lanqiao525_传球游戏 {
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();//同学人数
        int m=scan.nextInt();//传递次数
        int[][] dp=new int[m+1][n];//第m次传递到n号同学时的方法数
        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]+dp[i-1][(j-1+n)%n];//因为是围坐在一起,所以序号是循环的,如123412
            }
        }
        System.out.println("方案数为:"+dp[m][0]);//需要得出的是经过m次传递,球回到第一位同学手中的方案数
    }
}
java 复制代码
3 3 
方案数为:2

进程已结束,退出代码为 0
相关推荐
熊猫钓鱼>_>15 小时前
Rust语言特性深度解析:所有权、生命周期与模式匹配之我见
算法·rust·软件开发·函数·模式匹配·异步编程·质量工具
芒果量化15 小时前
Optuna - 自动调参利器&python实例
开发语言·python·算法·机器学习
麦麦大数据15 小时前
D025 摩托车推荐价格预测可视化系统|推荐算法|机器学习|预测算法|用户画像与数据分析
mysql·算法·机器学习·django·vue·推荐算法·价格预测
CoovallyAIHub15 小时前
IDEA研究院发布Rex-Omni:3B参数MLLM重塑目标检测,零样本性能超越DINO
深度学习·算法·计算机视觉
豐儀麟阁贵16 小时前
4.4数组的基本操作
java·开发语言·数据结构·算法
无限进步_16 小时前
【C语言】在矩阵中高效查找数字的算法解析
c语言·开发语言·数据结构·c++·其他·算法·矩阵
小白要加油努力16 小时前
滑动窗口的典例以及思路阐述
算法
CoovallyAIHub17 小时前
一夜之间,大模型处理长文本的难题被DeepSeek新模型彻底颠覆!
深度学习·算法·计算机视觉
天选之女wow17 小时前
【代码随想录算法训练营——Day43(Day42周日休息)】动态规划——300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
算法·leetcode·动态规划
敲代码的嘎仔17 小时前
JavaWeb零基础学习Day4——Maven
java·开发语言·学习·算法·maven·javaweb·学习方法