实验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动态规划——小明打王者相关推荐

  1. 2022-6-4 小明爱上课,切木头,最多分成多少块,躲猫猫,争渡

    1. 小明爱上课 [动态规划] 小明非常喜欢上课,现在小明的课表有一些课,他可以通过课表选择上哪些课. 上课会有奖励,每门课上课时间长短不同奖励也会不一样,存在上课时间更长,奖励更少的情况.每一门课上 ...

  2. [蓝桥杯]算法提高 第二点五个不高兴的小明(记忆化搜索||动态规划)

    问题描述 有一条长为n的走廊,小明站在走廊的一端,每次可以跳过不超过p格,每格都有一个权值wi. 小明要从一端跳到另一端,不能回跳,正好跳t次,请问他跳过的方格的权值和最大是多少? 输入格式 输入的第 ...

  3. 【动态规划】开心的小明

    [动态规划]开心的小明 贵有恒,何必三更起五更眠:最无益,莫过一日曝十日寒. [动态规划]开心的小明 时间限制: 1 Sec  内存限制: 128 MB 提交: 20  解决: 10 [提交][状态] ...

  4. 开心的小明-动态规划算法

    开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...

  5. ADV-369 第二点五个不高兴的小明 动态规划入门

    动态规划题目关键是确定状态,然后建立转移方程 package ADV; import java.io.BufferedReader; import java.io.IOException; impor ...

  6. 动态规划(6)——NYOJ469擅长排列的小明II*

    擅长排列的小明 II 描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列: 1.第一个数必须是1 2. ...

  7. 开心的小明 (NYOJ49) [动态规划.01背包]

    开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...

  8. PTA练习-- 寻宝,小明有一张藏宝图,上面有m*n个房间,每个房间里面都有一个有一定价值的宝物,小明只能从左上角的房间进入收集宝物...(动态规划)

    寻宝 小明有一张藏宝图,上面有m*n个房间,每个房间里面都有一个有一定价值的宝物,小明只能从左上角的房间进入收集宝物,且每次只能向右边或向下边的房间继续寻宝,最终只能从最右下的房间出来.请你帮小明计算 ...

  9. HDU 4521 小明系列问题——小明序列 LIS+动态规划

    HDU 4521小明系列问题--小明序列 Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u ...

最新文章

  1. 人脸识别引擎SeetaFaceEngine中Detection模块使用的测试代码
  2. pandas读取csv文件,变换文件格式,并转换成numpy数组,取出数据
  3. 35个高级Python知识点总结
  4. mysql master 配置_MySQL双Master配置的方法详解
  5. php 三方即时通讯_php即时通讯解决方案-请问PHP能否实现即时通讯?
  6. daoi php_使用php生成RSA公钥私钥及进行加密解密和签名验证
  7. return本质探究以及try-finaly下的return探究
  8. return 0可以不加吗_拼多多开店可以不交保证金? 拼多多0元开店是真的吗?
  9. python中breakpoint什么意思_it/breakpoint是什么意思
  10. 如何配置Java环境
  11. Tomcat-日志格式配置
  12. lvds、cml、lvpecl接口电平详解
  13. 基于决策树模型对 IRIS 数据集分类
  14. 中国绿色专利分地区统计数据
  15. 我心有猛虎,细嗅着蔷薇
  16. RabbitMQ:消费者ACK机制、生产者消息确认
  17. 地图定位之3D 地图
  18. ElasticSearch(四):ES nested嵌套文档与父子文档处理
  19. 芯片测试术语 ,片内测试(BIST),ATE测试
  20. c#获取当前时间 毫秒_C# 当前系统时间获取及时间格式详解

热门文章

  1. Win32多线程调用gdal库接口
  2. 借鉴美股200年板块市值变化 可视化分析A股行业分布格局
  3. 三相电非线性负载仿真电路--simulink模型
  4. ORA-01653 表xxx无法通过8(在表空间xxx中)扩展解决方法
  5. Hyperf插件之passport认证插件richard8768/hyperf-passport
  6. Odoo14免费开源ERP实施指南:CRM功能应用篇(1)
  7. [Unity] ACT 战斗系统学习 1:基于委托的事件管理器
  8. for、forEach 、for in、for of 循环的区别
  9. HPU算法协会公开课第一期:【基础算法1】5.17
  10. HNU OJ10320 穿越火线 简单模拟