动态规划——传球问题

题目链接: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取模是为了让索引可以循环出现,如还不懂,可以通过加深印象,记住就好了)

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次传递,球回到第一位同学手中的方案数
    }
}
3 3 
方案数为:2

进程已结束,退出代码为 0

 

 

相关推荐

  1. 动态规划问题

    2024-03-14 08:50:02       59 阅读
  2. 动态规划学习——背包问题

    2024-03-14 08:50:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 08:50:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 08:50:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 08:50:02       82 阅读
  4. Python语言-面向对象

    2024-03-14 08:50:02       91 阅读

热门阅读

  1. HTTP/1.1和HTTP/2的区别

    2024-03-14 08:50:02       32 阅读
  2. 课时63:流程控制_case条件控制_语法解读

    2024-03-14 08:50:02       42 阅读
  3. MCGS昆仑触摸屏快速上手

    2024-03-14 08:50:02       95 阅读
  4. LeetCode-213题:打家劫舍II(原创)

    2024-03-14 08:50:02       39 阅读
  5. MySQL8.0物理备份恢复核心流程

    2024-03-14 08:50:02       42 阅读
  6. Sentinel

    Sentinel

    2024-03-14 08:50:02      40 阅读
  7. AI人工智能小程序系统开发

    2024-03-14 08:50:02       30 阅读
  8. Day40-Rsync企业级备份工具讲解

    2024-03-14 08:50:02       41 阅读
  9. Linux环境搭建Hadoop及完全分布式集群

    2024-03-14 08:50:02       34 阅读
  10. MFC中手动create创建的窗口,如何销毁释放?

    2024-03-14 08:50:02       42 阅读