蓝桥杯-算法训练 印章
试题 算法训练 印章
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。
输入格式
一行两个正整数n和m
输出格式
一个实数P表示答案,保留4位小数。
样例输入
2 3
样例输出
0.7500
数据规模和约定
1≤n,m≤20
题解
思路
刚刚看到题目的时候,一开始以为是用高中学的概率论,组合数来做,但是后来发现自己实在是想不到,太复杂了,而且概率论也很久没学了,那么没办法了,只能是用动态规划来解决了
动态规划主要分为两步
第一步:确定初始状态
首先,我们知道,如果挑出一张牌,想要只抽中一种牌的概率肯定为1,接着,我们往下继续分析
我们现在思考一下,如果挑出i张牌,最后只抽中1种牌的概率是多少?
第一次肯定是1,第二次还是得抽中这张牌,那么概率就是 1 n \frac{1}{n} n1,第三次还是这张牌,概率为 ( 1 n ) 2 (\frac{1}{n})^2 (n1)2,推算下来,我们想要i张牌全部抽中1种牌的概率就是 ( 1 n ) i − 1 (\frac{1}{n})^{i-1} (n1)i−1
至此,初始状态已经确定了
特殊的,当 i < j i<j i<j时,想要从使 i i i张牌中有 j j j种牌,一定是不存在的,则概率为0
第二步:推算动态转移方程
这题动态转移方程有点难推理,但是也不是不能推理
当前我们要抽i张牌,并且要保证这i张牌中正好有j种牌,现在我们要对抽 i − 1 i-1 i−1张牌的状态进行分析
- 假设我们在抽第 i − 1 i-1 i−1张牌的时候,已经有j种牌了,那么此时,我们在抽第 i i i张牌时还要保证这i张牌正好有j种牌,那么我们这时候不得不抽中这j种牌中任何一张,所以概率是 d p [ i − 1 ] [ j ] ∗ j n dp[i-1][j]*\frac{j}{n} dp[i−1][j]∗nj
- 假设我们在抽第 i − 1 i-1 i−1张牌是,手上只有 j − 1 j-1 j−1种牌,那么此时,我们要保证这 i i i张牌中正好有j种牌,我们只能从这 j − 1 j-1 j−1种牌外再抽出一张,概率为 d p [ i − 1 ] [ j − 1 ] ∗ n − j + 1 n dp[i-1][j-1] * \frac{n-j+1}{n} dp[i−1][j−1]∗nn−j+1
最后我们可以得出动态转移方程:
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ∗ j n + d p [ i − 1 ] [ j − 1 ] ∗ n − j + 1 n dp[i][j] = dp[i-1][j]*\frac{j}{n}+dp[i-1][j-1]*\frac{n-j+1}{n} dp[i][j]=dp[i−1][j]∗nj+dp[i−1][j−1]∗nn−j+1
至此,此题已经分析完毕,剩下按照基本方法推就行了
java代码
import java.util.Scanner;/*** @author 王宇哲*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();//第一维界表示的是买彩票的张数,第二维界表示要凑齐的张数double[][] dp = new double[m+1][n+1];//买一张只凑齐1种的概率一定为1dp[1][1] = 1;//初始化for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(i<j){dp[i][j] = 0;}//买i张(只)凑齐1张的概率if(j == 1 && i != 1){dp[i][j] = Math.pow(1.0/n,i-1);}}}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){//防止重复赋值if(!(j == 1 && i != 1) && !(i==1 && j==1)){//前面j种已经凑齐了,又抽到了前面j中dp[i][j] += dp[i-1][j]*((double) j/n);//前面i张已经凑齐了j-1中,这次抽到其他的牌的概率dp[i][j] += dp[i-1][j-1] * ((n-j+1.0)/n);}}}System.out.printf("%.4f",dp[m][n]);}
}
蓝桥杯-算法训练 印章相关推荐
- 蓝桥杯 算法训练 印章
蓝桥杯 算法训练 印章 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入输出: 一行两个正整数n和m 一个实数P表示答案,保留4位小数. 样例: 2 3 ...
- 蓝桥杯算法训练 印章
蓝桥杯 算法训练 印章 问题描述 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入格式 一行两个正整数n和m 输出格式 一个实数P表示答案,保 ...
- 蓝桥杯算法训练-印章
这一题是10月份新加的题,网上也没啥答案,标签为dp动态规划,实际上我觉得不用动态规划也能做,毕竟python是自带了求组合数的函数,下面来看一下吧. 试题 算法训练 印章 资源限制 时间限制:1.0 ...
- C语言-蓝桥杯-算法训练 印章
问题描述 共有 n 种图案的印章,每种图案的出现概率相同.小A买了 m 张印章,求小A集齐 n 种印章的概率. 输入格式 一行两个正整数n和m. 输出格式 一个实数P表示答案,保留4位小数. 样例输入 ...
- 蓝桥杯算法训练 印章 C语言实现
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入格式 一行两个正整数n和m 输出格式 一 ...
- 蓝桥杯 算法训练 幸运的店家
蓝桥杯 算法训练 幸运的店家 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 炫炫开了一家商店,卖的货只有一个,XXX,XXX卖N元钱.有趣的是,世界上只有面值为3的幂的纸 ...
- 蓝桥杯 算法训练 Beaver's Calculator
蓝桥杯 算法训练 Beaver's Calculator 问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator ...
- 蓝桥杯算法训练-24点(Python)
问题描述 24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加.减.乘.除以及括号想办法得到24, ...
- 蓝桥杯——算法训练——数字三角形
蓝桥杯--算法训练--数字三角形 这道题不难,但是比较典型,可以作为动态规划(dp)的入门篇,属于线性dp(LIS,LCS和数字三角形都是此类题型). ------------------------ ...
最新文章
- 巴曙松:收到了Roger送的BCH,已全捐给慈善基金
- Eclipse Tomcat的一些基本配置
- 引入 ServletContextListener @Autowired null 解决办法
- mybatis-plus与jpa在操作数据库时写法对比
- /etc/fstab文件出错,无法进入Linux系统
- javascript HTMLElement
- [面试]排列组合与概率计算(一)
- [Android]EditText属性详解
- 输入url后的加载过程
- markdown的基本使用方法
- Android Studio 工具栏添加图标
- [转帖] “王者对战”之 MySQL 8 vs PostgreSQL 10
- 纯前端大数据处理技术:葡萄城纯前端开发工具应用实践
- 【HTML CSS】笔记初日 HTML基础
- NIST宣布推出前4种抗量子加密算法
- libfuse install error: fusermount.c:295:44: error: ‘CLONE_NEWNS’ undeclared (first use in this funct
- win10系统下载地址
- html中select和choose的区别
- 小米正式与联芯科技合作开发手机芯片
- 2017年双十一最全面的大数据分析报告在此!