「线性DP-步入」传球游戏

news2024/11/19 2:18:34

传球游戏

题目描述

​ 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。
​ 游戏规则是这样的: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

提示

  • 40%的数据满足:3 ≤ n ≤ 30,1 ≤ m ≤ 20
  • 100%的数据满足:3 ≤ n ≤ 30,1 ≤ m ≤ 30。
  • https://ac.nowcoder.com/acm/problem/16619

分析

看题目给出的样例,1->2->3->1 和 1->3->2->1,共2种。

首先从最后思考,可以看到从 1 开始传球,最后回到 1,那么它是如何回到这个 1 的呢?也就是说,它的上一个拿着球的人是谁呢(因为要从这个人传给 1)?

  • 有两个方向,一个是 1 的左边或 1 的右边,即为 n 或 2

那么 n 的球源又来着哪里呢?

  • 同样的,一个是 n 的左边或 n 的右边,即为 n-1 或 1

由上述可知,本题具有“重叠子问题” 可用 DP 解决。
现在我们知道:1 的左边是 n,右边是 2,而 n 的左边是 n-1,右边是 1,2 的左边和右边同理…
由此可见:第 i 次传球,想要球若在 j 手里,则必须第 i-1 次传球,球若在 j-1 或 j+1 手里。
Tips:当 j = 1 或 j = n 时,需要额外考虑。

  • 原问题:从 1 开始传球,最后回到 1 的方案数
  • 子问题:第 i 次传球,球若在 j 手里的方案数
  • DP 定义:第 i 次传球,球若在 j 手里的方案数
  • DP 方程:
    • 正常情况 : d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + d p [ i − 1 ] [ j + 1 ] dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] dp[i][j]=dp[i1][j1]+dp[i1][j+1]
    • 当 j = 1 时: d p [ i ] [ j ] = d p [ i − 1 ] [ n ] + d p [ i − 1 ] [ j + 1 ] dp[i][j] = dp[i-1][n] + dp[i-1][j+1] dp[i][j]=dp[i1][n]+dp[i1][j+1]
    • 当 j = n 时: d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + d p [ i − 1 ] [ 1 ] dp[i][j] = dp[i-1][j-1] + dp[i-1][1] dp[i][j]=dp[i1][j1]+dp[i1][1]
  • DP 初始化: d p [ 0 ] [ 1 ] = 1 dp[0][1] = 1 dp[0][1]=1(第 0 次传球,球落在 1 手里的方案数)

1643205449808

代码

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int MAX = 35;
        int[][] dp = new int[MAX][MAX];
        dp[0][1] = 1;
        for(int i = 1; i <= m; i++) {
            dp[i][1] = dp[i-1][n] + dp[i-1][1+1];
            for(int j = 2; j < n; j++) {
                dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1];
            }
            dp[i][n] = dp[i-1][n-1] + dp[i-1][1];
        }
        
        System.out.println(dp[m][1]);
    }
}

草稿纸

image-20230416182912608

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java -枚举的使用

一、背景及定义 枚举是在JDK1.5以后引入的。主要用途是&#xff1a;将一组常量组织起来&#xff0c;在这之前表示一组常量通常使用定义常量的方式&#xff1a; public static int final RED 1; public static int final GREEN 2; public static int final BLACK 3;但是常量…

Python3 OpenCV4 计算机视觉学习手册:1~5

原文&#xff1a;Learning OpenCV 4 Computer Vision with Python 3 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&a…

goland 启动go module 之后goland标红,unresolved reference 无法正常追踪代码

程序是别的同事写的,你这边从git上面拉下来 1.go build之后 所有的依赖都弄好了 2.go module也开启了 3.go程序能正常运行 最后还是依赖无法正常追踪 unresolved reference 解决步骤: 1.先让程序正常运行 go clean --modcache。再执行go run main.go或者go build重新编译 2.id…

如何通过开源项目搭建私有云平台--第四步上:安装rancher,搭建K8s集群

第四步上&#xff1a;安装rancher&#xff0c;搭建K8s集群 第四步比较复杂&#xff0c;因此准备分上中下三篇文章来介绍&#xff0c;本次采用rancher来部署K8s集群&#xff0c;选择rancher如下&#xff1a; 1&#xff09;部署K8s简单&#xff0c;有一个不是那么复杂的管理界面…

163种中草药(中药材)数据集说明(含下载地址)

163种中草药(中药材)数据集说明(含下载地址) 目录 163种中草药(中药材)数据集说明(含下载地址) 1. Chinese-Medicine-163数据集说明 2. Chinese-Medicine-163数据集下载 3. 深度学习实现中草药(中药材)识别 本文将分享一个大规模的中草药(中药材)图片数据集(Chinese-Medic…

Ubuntu18.04安装ROS Melodic

1.设置安装源 为了安装ROS Melodic&#xff0c;首先需要在Ubuntu 18.04 LTS上添加安装源到source.list&#xff0c;方法如下 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list 加…

元宇宙场景下的实时互动RTI技术能力构建

元宇宙可谓是处在风口浪尖&#xff0c;无数的厂商都对元宇宙未来抱有非常美好的憧憬。正因如此&#xff0c;许许多多厂商都在用他们自己的方案&#xff0c;为元宇宙更快、更好的实现&#xff0c;在自己的领域贡献力量。LiveVideoStack 2022北京站邀请到了 ZEGO 即构科技的解决方…

MobPush Android SDK厂商通道申请指南

华为厂商申请 创建应用 登录华为开发者联盟&#xff0c;注册您的应用&#xff0c;在应用信息中获取APP ID和Client Secret 配置SHA256证书指纹 在华为开发者联盟配置SHA256证书指纹。获取及配置请参见华为官方文档配置AppGallery Connect 设置消息回执 集成华为厂商通道SDK…

数据结构—双向链表

目录 1. 链表的种类 2. 最实用的两种链表类型 3. 实现双向带头循环链表 3.1 创建头节点 3.2 实现双向循环功能—返回头指针 3.3 尾插 3.4 头插 3.5 尾删 3.6 头删 4. 实现两个重要接口函数 4.1 随机插入 4.2 随机删除 5. 顺序表和链表总结 1. 链表的种类 由上面…

【Nginx网站服务】

安装Nginx服务 1.先去官网下载软件包 2.关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下 systemctl stop firewalld systemctl disable firewalld setenforce 0nginx-1.18.0.tar.gz nginx-1.22.0.tar.gz3.安装依赖包 #nginx的配置及运行需要pcre、zlib等软件…

javaEE汽车用油加油站销售管理系统servlet

经过我的实地考察&#xff0c;我发现现在的销售管理有以下弊端&#xff1a; (1)、大多数都是人工记录&#xff0c;人工开票&#xff0c;这样既费时费力&#xff0c;还费财&#xff1b; (2)、由于品种种类的增多&#xff0c;记录货品的资料变得麻烦&#xff1b; (3)、对一些顾客…

COMSOL锂离子电池仿真技术与应用

背景&#xff1a; 随着各国燃油车禁售时间表的推出&#xff0c;新能源汽车的地位愈发稳固。而锂离子电池作为电动车的核心动力源&#xff0c;也越来越受到市场的追捧。锂离子电池在制作过程中涉及正极、电解液、负极、隔膜等材料的选取与匹配&#xff0c;极片设计参数的选择等…

原型设计工具即时设计、Axure、Figma、Sketch,哪个更好用?

在线网页原型图设计软件的使用与桌面端相比具备优势&#xff0c;因为在线网页原型图设计软件的使用全程不需要安装&#xff0c;而且在线网页原型图设计软件也没有任何地点上的限制&#xff0c;更主要的是在线网页原型图设计软件在操作系统上也没有限制&#xff0c;不论是现在使…

分享10个前端开发者需要掌握的DOM技巧

Web开发不断发展&#xff0c;掌握最新的趋势和最佳实践对每位开发者来说都至关重要。Web开发的最重要方面之一就是使用文档对象模型&#xff08;DOM&#xff09;。在本文中&#xff0c;我们将探讨10个必须掌握的DOM技巧和技巧&#xff0c;配有代码示例&#xff0c;这将帮助您成…

camunda工作流user task节点用途

Camunda中的User Task用于在流程中定义人工任务&#xff0c;需要一个人来执行该任务并提供相关信息。通常&#xff0c;User Task在业务流程中用于需要人类干预的步骤&#xff0c;例如审核、审批、调查等。 User Task具有以下特性&#xff1a; 1、指派任务给具体的用户或用户组…

leetcode547. 省份数量

有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不含其他没有相连的城市。 给你一…

讨论度超20亿,肯德基疯狂星期四是如何出圈的?

每到周四&#xff0c;网上就会出现一股“神秘力量”——今天是星期四&#xff0c;V我50&#xff0c;请我吃肯德基。 肯德基疯狂星期四能有多火&#xff1f; 目前&#xff0c;#肯德基疯狂星期四#话题阅读量超23亿次&#xff0c;参与讨论次数超600万&#xff0c;而带话题原创人数…

不得不说的结构型模式-桥接模式

桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它可以将抽象部分与实现部分分离&#xff0c;使得它们可以独立地变化。桥接模式的核心思想是将一个系统分成两个独立的部分&#xff0c;抽象部分和实现部分&#xff0c;并且让它们可以互相独立…

sublime text的snippet介绍,提高编程效率

自定义Snippet Sublime Text 的 Snippet 是一种快捷方式&#xff0c;它允许您使用自定义模板或代码片段更快地编写代码。以下是创建 Snippet 的步骤&#xff1a; 打开 Sublime Text 编辑器并创建一个新文件。菜单栏选择 “Tools” -> “Developer” -> “New Snippet”…

python里面单双下划线的区别

区别&#xff1a; xx:公有变量&#xff0c;所有对象都可以访问&#xff1b; xxx:双下划线代表着是系统定义的名字。 __xxx&#xff1a;双前置下划线&#xff0c;避免与子类中的属性命名冲突&#xff0c;无法在外部直接访问。代表着类中的私有变量名。 _xxx&#xff1a;单前置…