实验1动态规划——小明打王者
实验1动态规划——小明打王者
问题:
小明想要在王者荣耀游戏里晋升一个段位,假设他一共需打了n场比赛,且必须成功赢得至少70%的场次才能成功晋升。假设每场比赛小明获胜的概率分别为p1,p2,…,pn,请帮他算出成功晋级段位的概率是多少?
输入:
参数1:整数num(0<=num<=1000),表示比赛的场数。参数2:整数数组p[num] = {p1,p2,…,pnum},其中pi表示小明有pi%的概率赢得第i场比赛。(0<=pi<=100)
输出:
成功晋级段位的概率,保留小数点后5位,最后结果四舍五入。
分析:
——分析最优子结构:首先确定描述原问题以及其子问题的统一结构。设a[i][j]表示小明已经进行了i场比赛并且赢了j场的概率,那么问题转化为求a[num][0.7*num](其中0.7*num向上取整)一直加到a[num][num]的结果。对于a[i][j]而言,由于其仅有一个精确解而非一个优化问题,因此将其解视为最优解,a[i][j]的解取决于其子结构(子问题)的解:若第i场输了,那么前i场赢j场的概率等于前i-1场赢j场的概率乘以第i场输的概率;若第i场赢了,那么前i场赢j场的概率等于前i-1场赢j-1场的概率乘以第i场赢的概率。可以说,父问题有(最优)解时,子问题也有(最优)解,即具有最优子结构性质。
——确定递推关系:根据最优子结构,可以得出递推公式如下:a[i][j] = a[i-1][0] * (1 - P[i]) , j=0 ; a[i][j] = a[i-1][j] * (1-P[i]) + a[i-1][j-1] * P[i] , j>0;
——计算最优值:初始化最小子问题:a[0][0] = 1,a[k][k] = p1p2…pk;根据递推公式,画出求解矩阵a的顺序:
1 | ||||||
---|---|---|---|---|---|---|
TBD1 | P1 | |||||
TBD2 | TBDnum+1 | … | ||||
TBD3 | … | … | … | |||
TBD4 | … | … | … | … | ||
… | … | … | … | … | … | |
TBDnum | … | … | … | … | … | p1p2…pnum |
首先根据题意,i>=j,则矩阵只需求解对角线及左下半部分。初始化矩阵的对角线。根据递推公式,计算第一列的所有元素需要其上方的元素,计算其它列的元素需要其上方和左上方的元素,因此按照图中的TBD标号顺序逐列求解即可。
——求最优解:由于本题只需给出晋级概率,故不需额外空间来记录问题轨迹并traceback
伪代码:
for i = 1 to num doa[i][i] = a[i - 1][i - 1] * 0.01d * p[i - 1]for j = 0 to num - 1 dofor i = j + 1 to num doif j = 0a[i][0] = a[i + j - 1][0] * (1 - 0.01d * p[i - 1])elsea[i][j] = a[i - 1][j] * (1 - 0.01d * p[i - 1]) + a[i - 1][j - 1] * 0.01d * p[i - 1]for i = ceil(0.7 * num) to numpass += a[num][i]
代码:
public class GamePassProbability {// 计算小明晋级成功的可能性// 输入:int数组p表示每一局的获胜可能性,int数字num表示一共要打多少局// 输出:小明晋级的可能性public static double calculatePassProbability(int[] p, int num) {double pass = 0.0d;// 最终结果double[][] a = new double[num + 1][num + 1];// 子问题记录矩阵// 初始化矩阵,对角线赋值a[0][0] = 1.0d;for (int i = 1; i <= num; i++) {a[i][i] = a[i - 1][i - 1] * 0.01d * p[i - 1];}// 依次计算矩阵内容,按照列顺序自上而下计算for (int j = 0; j <= num - 1; j++) {// 先枚举列for (int i = j+1; i <= num; i++) {// 再枚举行if (j == 0)// 第一列a[i][0] = a[i + j - 1][0] * (1 - 0.01d * p[i - 1]);else {// 其他列a[i][j] = a[i - 1][j] * (1 - 0.01d * p[i - 1]) + a[i - 1][j - 1] * 0.01d * p[i - 1];}}}a[0][0] = 1.0d;// 得出结果int s = (int) Math.ceil(0.7 * num);// 向上取整for (int i = s; i <= num; i++)pass += a[num][i];return pass;}public static void main(String[] args) {int[] p1 = { 50, 50, 50, 50 };int[] p2 = { 80, 80, 90, 90, 99 };int[] p3 = {};double result1 = calculatePassProbability(p1, 4);double result2 = calculatePassProbability(p2, 5);double result3 = calculatePassProbability(p3, 0);System.out.println(result1);System.out.println(result2);System.out.println(result3);}}
复杂度分析:
——输入规模大小:序列p长度num,此处记为n
——基本操作次数:根据递推式计算a[i][j]
——输入情况:只与问题的规模有关,和问题的输入好坏无关
——时间复杂度:算法是非递归的,直接累加求和就可以得到其时间复杂度为O(n2)
——空间复杂度:额外空间为O(n2)
实验1动态规划——小明打王者相关推荐
- 2022-6-4 小明爱上课,切木头,最多分成多少块,躲猫猫,争渡
1. 小明爱上课 [动态规划] 小明非常喜欢上课,现在小明的课表有一些课,他可以通过课表选择上哪些课. 上课会有奖励,每门课上课时间长短不同奖励也会不一样,存在上课时间更长,奖励更少的情况.每一门课上 ...
- [蓝桥杯]算法提高 第二点五个不高兴的小明(记忆化搜索||动态规划)
问题描述 有一条长为n的走廊,小明站在走廊的一端,每次可以跳过不超过p格,每格都有一个权值wi. 小明要从一端跳到另一端,不能回跳,正好跳t次,请问他跳过的方格的权值和最大是多少? 输入格式 输入的第 ...
- 【动态规划】开心的小明
[动态规划]开心的小明 贵有恒,何必三更起五更眠:最无益,莫过一日曝十日寒. [动态规划]开心的小明 时间限制: 1 Sec 内存限制: 128 MB 提交: 20 解决: 10 [提交][状态] ...
- 开心的小明-动态规划算法
开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...
- ADV-369 第二点五个不高兴的小明 动态规划入门
动态规划题目关键是确定状态,然后建立转移方程 package ADV; import java.io.BufferedReader; import java.io.IOException; impor ...
- 动态规划(6)——NYOJ469擅长排列的小明II*
擅长排列的小明 II 描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列: 1.第一个数必须是1 2. ...
- 开心的小明 (NYOJ49) [动态规划.01背包]
开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...
- PTA练习-- 寻宝,小明有一张藏宝图,上面有m*n个房间,每个房间里面都有一个有一定价值的宝物,小明只能从左上角的房间进入收集宝物...(动态规划)
寻宝 小明有一张藏宝图,上面有m*n个房间,每个房间里面都有一个有一定价值的宝物,小明只能从左上角的房间进入收集宝物,且每次只能向右边或向下边的房间继续寻宝,最终只能从最右下的房间出来.请你帮小明计算 ...
- HDU 4521 小明系列问题——小明序列 LIS+动态规划
HDU 4521小明系列问题--小明序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
最新文章
- 人脸识别引擎SeetaFaceEngine中Detection模块使用的测试代码
- pandas读取csv文件,变换文件格式,并转换成numpy数组,取出数据
- 35个高级Python知识点总结
- mysql master 配置_MySQL双Master配置的方法详解
- php 三方即时通讯_php即时通讯解决方案-请问PHP能否实现即时通讯?
- daoi php_使用php生成RSA公钥私钥及进行加密解密和签名验证
- return本质探究以及try-finaly下的return探究
- return 0可以不加吗_拼多多开店可以不交保证金? 拼多多0元开店是真的吗?
- python中breakpoint什么意思_it/breakpoint是什么意思
- 如何配置Java环境
- Tomcat-日志格式配置
- lvds、cml、lvpecl接口电平详解
- 基于决策树模型对 IRIS 数据集分类
- 中国绿色专利分地区统计数据
- 我心有猛虎,细嗅着蔷薇
- RabbitMQ:消费者ACK机制、生产者消息确认
- 地图定位之3D 地图
- ElasticSearch(四):ES nested嵌套文档与父子文档处理
- 芯片测试术语 ,片内测试(BIST),ATE测试
- c#获取当前时间 毫秒_C# 当前系统时间获取及时间格式详解
热门文章
- Win32多线程调用gdal库接口
- 借鉴美股200年板块市值变化 可视化分析A股行业分布格局
- 三相电非线性负载仿真电路--simulink模型
- ORA-01653 表xxx无法通过8(在表空间xxx中)扩展解决方法
- Hyperf插件之passport认证插件richard8768/hyperf-passport
- Odoo14免费开源ERP实施指南:CRM功能应用篇(1)
- [Unity] ACT 战斗系统学习 1:基于委托的事件管理器
- for、forEach 、for in、for of 循环的区别
- HPU算法协会公开课第一期:【基础算法1】5.17
- HNU OJ10320 穿越火线 简单模拟