[蓝桥杯]-算法训练组-python

本文介绍了两种使用动态规划(DP)解决实际问题的案例。第一个案例是关于计算在印章收集过程中集齐所有不同印章的概率,通过构建二维数组并利用状态转移方程求解。第二个案例涉及在 NxN 方格中获取最多金币的问题,同样采用DP策略,通过比较上下左右相邻格子的金币数量来确定最优路径。这两个问题展示了动态规划在解决复杂概率计算和最优化问题上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

1.印章

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

此题采用动态规划(Dynamic Programming,DP)的方法求解,动态规划的三要素:最优子结构、边界和状态转移函数。

最优子结构:每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到
边界:问题最小子子集的解(初始范围)
状态转移函数:从一个阶段向另一个阶段过度的具体形式,描述的是两个相邻子问题之间的关系(递推式)
参考博主

·设置状态:当前状态下的数据包含小A手里的印章数目、印章的种类数目,因此可以构建二维数组dp[i][j]来存储概率。令dp[i][j] = 小A手里的印章数目为i、印章的总种类数目为n时小A收集齐j种印章的概率。

#法1 
n,m = map(int,input().split())
dp = [ [0 for i in range(25)] for j in range(25)]
for i in range(1,m+1):
	for j in range(1,n+1):
		if i < j:
			dp[i][j] = 0
		elif j == 1:
			dp[i][j] = (1/n) ** (i-1)
		else:
			dp[i][j] = ( dp[i-1][j]) * (j*1.0/n) + (dp[i-1][j-1]) * (n-j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tialyg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值