目录:

题目描述

题目思路

代码段


  • 题目描述

  • 资源限制

    内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

    问题描述

      共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。

    输入格式

      一行两个正整数n和m

    输出格式

      一个实数P表示答案,保留4位小数。

    样例输入

    2 3

    样例输出

    0.7500

    数据规模和约定

      1≤n,m≤20


  • 题目思路

  • 1、首先我们得看明白题目的要求:买了m张印章集齐在n种印章中的j种概率(可能会有点拗口,本人也是看了很多大佬的解题思路才看明白题目的,这是按照自己表述出来,这个j就是方便我们理解的)
  • 第一步:确定这是个动态规划的问题(DP)

分享一个比较实用的解决DP算法的步骤:

1.确认状态,即DP数组中值的含义(看是一维数组还是二维数组,一般的题目都是二维数组)

                 2.设计状态转移方程

                3.设置DP数组的初始值

第二步:设置二维数组arr[i][j],表示买i种印章集齐j种图案的概率,购买印章的概率为p=1/n

第三步:根据DP算法步骤,首先确定初始值,当j=1时(即只需要集齐一种印章),分情况考虑:

当i=1 只买一张印章需要凑齐一种,无论如何其概率都为1
当i<1 购买的数量小于凑齐的种类,说明永远达不到目标,概率为0(在任何情况下适用)
当i>1 购买i张印章需要集齐一种图案(说明i张印章的图案都要一致),购买每款印章的概率为i个p相乘,即(1/n)^(i),因为总共有n种印章,所以其概率还要*n,推算为(1/n)^(i-1)

设好初始值后,考虑中间状态;在购买的第i张中,与前i-1张有两种可能,一是正好集齐了j款,二是前面i-1张集齐了j-1种;

第一种可能 正好集齐了j种,那么第i张只能是前j种图案中的一种(否则不符合题意),根据公式表达为arr[i][j]=arr[i-1][j]*j*p
第二种可能 前面的i-1张只集齐了j-1款图案,也就是还差一款,那么第i张只能是除去n款中的j-1款中的其中一个,根据公式表达为arr[i][j]=arr[i-1][j-1]*(n-j-1)*p

到这里就结束了,还需要注意的是,中间状态中的两种可能在代码里不需要再去分情况判断,直接相加即可,即arr[i][j]=arr[i-1][j]*j*p+arr[i-1][j-1]*(n-j-1)*p。


  • 代码段

import java.util.Scanner;public class Main {public static void main(String[] args) {// TODO Auto-generated method stubScanner input=new Scanner(System.in);int n=input.nextInt();int m=input.nextInt();double arr[][]=new double[m+1][n+1];double p=1.0/n;int i,j;for(i=1;i<=m;i++) {for(j=1;j<=n;j++) {if(i<j)arr[i][j]=0;if(j==1) {arr[i][j]=Math.pow(p, i-1);}else {arr[i][j]=arr[i-1][j-1]*(n-j+1)*p+arr[i-1][j]*(j*p);}}}System.out.printf("%.4f",arr[m][n]);}}

蓝桥杯 算法 DP 印章 java相关推荐

  1. 蓝桥杯 算法训练 印章

    蓝桥杯 算法训练 印章 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入输出: 一行两个正整数n和m 一个实数P表示答案,保留4位小数. 样例: 2 3 ...

  2. 蓝桥杯算法训练 印章

    蓝桥杯 算法训练 印章 问题描述 ​ 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入格式 ​ 一行两个正整数n和m 输出格式 ​ 一个实数P表示答案,保 ...

  3. 蓝桥杯-算法训练 印章

    试题 算法训练 印章 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入格式 一行两个正整 ...

  4. 蓝桥杯算法训练(java)--网络流裸题

    题目:一个有向图,求1到N的最大流 输入格式 第一行N M,表示点数与边数 接下来M行每行s t c表示一条从s到t的容量为c的边 先备知识与注意事项 考虑如下情境: 在某个污水处理厂的某一道程序里, ...

  5. 蓝桥杯算法训练-印章

    这一题是10月份新加的题,网上也没啥答案,标签为dp动态规划,实际上我觉得不用动态规划也能做,毕竟python是自带了求组合数的函数,下面来看一下吧. 试题 算法训练 印章 资源限制 时间限制:1.0 ...

  6. 蓝桥杯算法拿金币-----Java实现

    问题描述 有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币.你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里.请问如何走才能拿到最多的金币. 输入格式 ...

  7. C语言-蓝桥杯-算法训练 印章

    问题描述 共有 n 种图案的印章,每种图案的出现概率相同.小A买了 m 张印章,求小A集齐 n 种印章的概率. 输入格式 一行两个正整数n和m. 输出格式 一个实数P表示答案,保留4位小数. 样例输入 ...

  8. CSDN蓝桥杯算法题——题解Java版本——切面条

    目录 题目:切面条 答案目标: 推导过程: 解析过程: 对照Java编码1: 对照Java编码2: 总结: 题目:切面条 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以 ...

  9. 蓝桥杯算法训练(java)--Anagrams问题前缀表达式大小写转换

    Anagrams问题 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,"Unclear"和"N ...

最新文章

  1. 《程序员做饭指南》霸榜 GitHub!不仅有量筒、烧杯,还用上了数学公式?
  2. MIPS中的异常处理和系统调用【转】
  3. python培训中心-想学python,上海Python培训中心哪个好?
  4. 响应式编程RxJava (一)
  5. 转载--html显示当前时间
  6. 【C language】动态数组的创建和使用
  7. Java工作笔记-使用Hibernate连接mysql数据库并进行增、删、改、查!
  8. Linux系统C/C++通用错误码实现模板
  9. linux下串口程序测试
  10. 阿里云MaxCompute中pyODPS的使用:多线程上传、下载、分区
  11. filebeat配置文件
  12. STM32单片机简介
  13. SIM900A—基础指令
  14. 科技爱好者周刊:第 103 期
  15. word排版案例报告_轻松搞定论文格式,这是 Word 排版的正确姿势
  16. 在马克思手稿中有一道趣味的数学问题:一共有30个人,可能包括男人,女人和小孩。他们在一家饭馆吃饭共花了50先令,其中每个男人花3先令,每个女人花2先令,每个小孩花1先令。请问男人、女人和小孩各几人?
  17. 【JAVA】顺序表与ArrayList
  18. win10彻底永久关闭自动更新【亲测有效】
  19. CSDN提供的博客搬家功能体验[持续跟踪]
  20. 工业级无线AP是什么

热门文章

  1. 通过pid查看端口号
  2. 小白也能接广告赚钱,实操月入3000+项目详解
  3. mac 安装 maven 过程
  4. Linux系统符号详解(所有用到的符号)
  5. css 实现超出两行、多行文字省略号显示
  6. 起床困难综合症 NOI2014
  7. 10-[案例2]个人简历
  8. 44_Pandas将分类变量转换为虚拟变量(get_dummies)
  9. php集成支付宝接口,支付宝接口开发集成支付环境小结
  10. Swift5多线程系列一GCD基础篇