蓝桥杯 试题 算法训练 印章

这篇具有很好参考价值的文章主要介绍了蓝桥杯 试题 算法训练 印章。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

试题 算法训练 印章

动态规划:

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

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

输入格式

一行两个正整数n和m

输出格式

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

样例输入

2 3

样例输出

0.7500

数据规模和约定

1≤n,m≤20

题目意思简洁明了。。。。

动态规划

1.设置状态(看是一维数组还是二维数组,一般的题目都是二维数组,经验之谈)

2.找状态之间的关系,

3.写代码

这其中1,2是最难的,首先把状态想出来这一步就可以劝退很多人了,怎么想状态呢,把我平时做dp的思路跟你们说一下:

首先看题目,有买的印章数和印章种数两个变量,就自然而然地想成二维数组dp[i] [j],数组有了。状态呢?题目要求的是概率嘛,那我们dp数组的值就是概率。那么,i,j怎么说呢?题目说了小A买了m张,要凑齐n种,那么我们就设:dp[i] [j]表示买 i 张凑齐 j 种印章的概率。

这样,状态就大致想出来了!(为什么是大致?因为不确定我们的思路是不是对的,状态是根据题意、经验和感觉设想出来的),可能就是要多做吧。

蓝桥杯 试题 算法训练 印章,算法,蓝桥杯,动态规划

状态设想出来,二维数组的表格先画出来(如上图)。然后寻找初始状态(一般都是i == 1,2,3或者j == 1,2,3这种i,j的值很小的)。

题目中有 n 种印章, 每种概率是 1/n;

先来看i<j的时候:因为买 i 张最多只能凑齐 i 种,所以这种情况概率为0

再来看j=1的时候:

i=1:dp[i] [1]表示的意思是买 i 张凑齐 1 种的概率,很明显 i == 1 && j == 1 的时候dp[1] [1] = 1,因为你买一张是无论如何都可以凑齐一种的,是吧。

i > 1:i > 1 && j == 1. 意思就是买 i 张凑齐 1 种印章的概率,意味着买的这 i 张印章是同一种,概率就是 (1/n)^i,但是,我们这 i 张要么是第一种,要么是第二种…( 要么是第k种 ,1 <= k <= n )。最后还要乘上n,所以这个情况 dp[i] [j] = (1/n)^(i-1)

初始状态大致就上面这些了:↑

最后来看中间的状态 dp[i] [j]:

我们买的第 i 张,有两种状态,一:跟前面买的 i-1 张中有重复的 二:跟前面买的 i-1 张中没有重复的

什么意思呢? 比如:(总共有5种印章,标号1,2,3,4,5) 我正在买第5张,前面四张凑齐了1,2,3,4号,那么第5张如果也是1,2,3,4号中的一个就表示重复的;如果第5张是5号,就表示没有重复的。

一:有重复的:就表明前面买的 i-1 张,已经凑齐了 j 种。dp[i] [j] = dp[i-1] [j] * ( j / n ); j/n是什么意思?

蓝桥杯 试题 算法训练 印章,算法,蓝桥杯,动态规划

二:无重复的

前面买的 i-1 张 凑齐了 j-1 种, 我们买的第 i 张与前面的不重复,就又凑齐了一种:

蓝桥杯 试题 算法训练 印章,算法,蓝桥杯,动态规划

dp[i] [j] = dp[i-1] [j-1] * (n-j+1) / n;

然后把两种情况加起来就是dp[i] [j] 的概率了!!

#include <iostream>
#include <cmath>
using namespace std;
double dp[25][25], p;
int main()
{
	
    //记住是小数啊,要*1.0进行类型转换的
	int n, m;
	cin >> n >> m;
	p = 1.0 / n; //每种出现的概率
	
	for ( int i = 1; i <= m; ++i ) {
		for ( int j = 1; j <= n; ++j ) {
			if ( i <  j ) dp[i][j] = 0;
			if ( j == 1 ) {
				dp[i][j] = pow (p, i-1);  //p^(i-1)
			}
			else {
				dp[i][j] = dp[i-1][j] * (j*1.0/n) + dp[i-1][j-1] * ((n-j+1)*1.0/n);
			}
		}
	}
//	cout << "dp\n";
//		for ( int i = 1; i <= m; ++i ) {
//		for ( int j = 1; j <= n; ++j ) {
//			printf("%.2lf  ",dp[i][j]);
//		}
//		cout << endl;
//	}
	
	printf("%.4lf  ",dp[m][n]);
	return 0;
}

总结:

1.数组确定(一维,还是二维,三维,n维也有…一般没有)

2.数组值(题目求什么,我们数组表示的值一般就是什么

3.状态设想 (dp[i] [j]表示 什么什么 i 什么什么 的时候什么什么 j 什么什么的时候

4.初始状态(就是找特殊值,i=1,2,3 j=1,2,3)

5.中间状态 ( i, j 与 i-1, i-2, j-1, j-2…)

6.写代码文章来源地址https://www.toymoban.com/news/detail-620718.html

到了这里,关于蓝桥杯 试题 算法训练 印章的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯算法全集之多重背包问题I(动态规划算法)

    有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 s i 件,每件体积是 v i ,价值是 w i 。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。 用下面这个图来分别动态规划的四个经典背包问题 定义状态的含义(这一步需要

    2023年04月08日
    浏览(38)
  • day55 算法训练|动态规划part15

    给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,\\\"ace\\\"是\\\"abcde\\\"的一个子序列,而\\\"aec\\\"不是)。 其实就是最长公共子序列的变种题:如果公共子序列长度等于

    2024年02月02日
    浏览(61)
  • day52 算法训练|动态规划part13

    参考:代码随想录 1. dp[i]的定义 本题中,正确定义dp数组的含义十分重要。 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候, 如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列

    2024年01月15日
    浏览(38)
  • day48算法训练|动态规划part09

    1. dp数组(dp table)以及下标的含义 dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i] 。 2.递推公式 决定dp[i]的因素就是第i房间偷还是不偷。 如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多

    2024年01月16日
    浏览(41)
  • 算法训练day49|动态规划part10

    贪心 因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。 本次重点学习动态规划方法 1. dp数组(dp table)以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金,一开始现金为负数,所以第一天就持有股票的话,

    2024年02月03日
    浏览(44)
  • 代码随想录算法训练51 | 动态规划part12

    本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰  视频讲解: 动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili 代码随想录 相对122.买卖股票的最佳时机II ,本题只需要在计算卖出操

    2024年01月18日
    浏览(54)
  • 算法竞赛备赛之动态规划训练提升,DP基础掌握

    01背包问题是在M件物品中选择若干件放在空间为W的背包中,每件物品的体积为W1,W2至Wn,价值为P1,P2至Pn,01背包的约束条件是给定几种物品,每种物品有且只有一个,并且有权值和体积两个属性。 01背包问题常常采用动态规划的方法去求解,状态转移方程为:F(W,i)=max{F(W,

    2024年02月08日
    浏览(41)
  • 算法训练Day39:62.不同路径 63. 不同路径 II 动态规划

    Category Difficulty Likes Dislikes ContestSlug ProblemIndex Score algorithms Medium (67.70%) 1746 0 - - 0 Tags Companies 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

    2023年04月25日
    浏览(44)
  • 算法训练day41|动态规划 part03(LeetCode343. 整数拆分、96.不同的二叉搜索树)

    题目链接🔥🔥 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 说明: 你可以假设 n 不小于 2 且不大于

    2024年02月10日
    浏览(39)
  • 算法训练第三十八天|动态规划理论基础、509. 斐波那契数 、70. 爬楼梯 、 746. 使用最小花费爬楼梯

    参考:https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 动态规划是什么 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以 动态规划中每一个状态一定是由上一个状态推导出来的 ,这一

    2024年02月04日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包