蓝桥杯 算法 DP 印章 java
目录:
题目描述
题目思路
代码段
题目描述
资源限制
内存限制: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相关推荐
- 蓝桥杯 算法训练 印章
蓝桥杯 算法训练 印章 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入输出: 一行两个正整数n和m 一个实数P表示答案,保留4位小数. 样例: 2 3 ...
- 蓝桥杯算法训练 印章
蓝桥杯 算法训练 印章 问题描述 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入格式 一行两个正整数n和m 输出格式 一个实数P表示答案,保 ...
- 蓝桥杯-算法训练 印章
试题 算法训练 印章 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入格式 一行两个正整 ...
- 蓝桥杯算法训练(java)--网络流裸题
题目:一个有向图,求1到N的最大流 输入格式 第一行N M,表示点数与边数 接下来M行每行s t c表示一条从s到t的容量为c的边 先备知识与注意事项 考虑如下情境: 在某个污水处理厂的某一道程序里, ...
- 蓝桥杯算法训练-印章
这一题是10月份新加的题,网上也没啥答案,标签为dp动态规划,实际上我觉得不用动态规划也能做,毕竟python是自带了求组合数的函数,下面来看一下吧. 试题 算法训练 印章 资源限制 时间限制:1.0 ...
- 蓝桥杯算法拿金币-----Java实现
问题描述 有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币.你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里.请问如何走才能拿到最多的金币. 输入格式 ...
- C语言-蓝桥杯-算法训练 印章
问题描述 共有 n 种图案的印章,每种图案的出现概率相同.小A买了 m 张印章,求小A集齐 n 种印章的概率. 输入格式 一行两个正整数n和m. 输出格式 一个实数P表示答案,保留4位小数. 样例输入 ...
- CSDN蓝桥杯算法题——题解Java版本——切面条
目录 题目:切面条 答案目标: 推导过程: 解析过程: 对照Java编码1: 对照Java编码2: 总结: 题目:切面条 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以 ...
- 蓝桥杯算法训练(java)--Anagrams问题前缀表达式大小写转换
Anagrams问题 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,"Unclear"和"N ...
最新文章
- 《程序员做饭指南》霸榜 GitHub!不仅有量筒、烧杯,还用上了数学公式?
- MIPS中的异常处理和系统调用【转】
- python培训中心-想学python,上海Python培训中心哪个好?
- 响应式编程RxJava (一)
- 转载--html显示当前时间
- 【C language】动态数组的创建和使用
- Java工作笔记-使用Hibernate连接mysql数据库并进行增、删、改、查!
- Linux系统C/C++通用错误码实现模板
- linux下串口程序测试
- 阿里云MaxCompute中pyODPS的使用:多线程上传、下载、分区
- filebeat配置文件
- STM32单片机简介
- SIM900A—基础指令
- 科技爱好者周刊:第 103 期
- word排版案例报告_轻松搞定论文格式,这是 Word 排版的正确姿势
- 在马克思手稿中有一道趣味的数学问题:一共有30个人,可能包括男人,女人和小孩。他们在一家饭馆吃饭共花了50先令,其中每个男人花3先令,每个女人花2先令,每个小孩花1先令。请问男人、女人和小孩各几人?
- 【JAVA】顺序表与ArrayList
- win10彻底永久关闭自动更新【亲测有效】
- CSDN提供的博客搬家功能体验[持续跟踪]
- 工业级无线AP是什么