浅谈动态规划优化

2024-09-05 21:32
文章标签 动态 规划 优化 浅谈

本文主要是介绍浅谈动态规划优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动态规划是解决多阶段决策最优化问题的一种思想方法。

有时动态规划的时间复杂度过高,需要我们对动态规划进行优化。

对动态规划进行优化的普遍方法是重新定义阶段,我们用一个例子来加以说明:


鹰蛋问题:

有一堆共 M 个鹰蛋,一位教授想研究这些鹰蛋的坚硬度 E。他是通过不断从一幢 N 层的楼上向下扔鹰蛋

来确定 E 的,当鹰蛋从第 E 层楼及以下楼层落下 时是不会碎的,但从第(E+1)层楼及以上楼层向下落时会摔碎。

如果鹰蛋未摔碎,还可以继续使用,但如果鹰蛋全碎了却仍未确定 E,这显然是一个失败的实验。教授希望实验是成功的

这里假设所有的鹰蛋都具有相同的坚硬度。给定鹰蛋个数 M 与楼层数 N。 要求最坏情况下确定 E 所需要的最少次数


 

分析这个问题可以知道它是求一个最优值,那么我们很自然想到用动态规划来做题。

可以发现这个问题的阶段还是比较明显的。可以根据鹰蛋数和楼层来划分阶段

定义状态:定义状态dp[i][j]是当i个鹰蛋在长度为j的楼上最坏情况下确定E所需要的最少次数。

                  比如dp[3][5]是指3个鹰蛋在楼层数为5的楼上最坏情况下确定E所需要的最少次数。

 

状态转移:在进行状态转移的时候,我们可以从两方面来考虑,一是考虑该状态可以由什么状态转移过来。如果这方面

                  不容易想的话,可以考虑这个状态可以想什么状态转移。具体到这个问题,我们在楼层数为j的楼上测试i个

                  鹰蛋有j个决策,分别是从第1层扔下,从第2层扔下......从第j层扔下。每次扔下都有两个情况。

                  假设鹰蛋再第k层扔下(1<=k<=j):

                  1. 鹰蛋没碎:如果鹰蛋没碎,那么在楼层数为k-1个楼上测试i个鹰蛋在最坏情况下的最少次数再加上本次测

                      试就是dp[i][j]的值。

                  2. 鹰蛋碎了:如果鹰蛋碎了,那么在楼层数为j-k个楼上测试i-1个鹰蛋在最坏情况下的最少次数再加上本次测

                      试就是dp[i][j]的值。

                  因为题目要求在最坏情况下,所以我们要在两种情况中选一个最大值,又要求最少次数所以要在j个决策中选

                  一个值最小的。

                 所以状态转移方程为dp[i][j] = min{ max{ dp[i-1][j-k], dp[i][k-1] } + 1  | 1<=k<=j };

 

按一个方向求出该问题的解: 根据状态转移方程,可以看出如果我们要得出dp[i][j]的值,我们要得出dp[i-1][]的值和

                dp[i][k-1](k <= j)的值。所以i应该在外循环,从小到大。j应该在内循环,从小到大。

代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define mmset(a,b) memset(a,b,sizeof(a))
using namespace std;const int INF = 999999999;int dp[55][10005];		//定义状态 /*
2 10 
2 100 
2 300 
25 900
Sample Output
4
14
24
10
*/int main()
{int n,m;while(~scanf("%d%d",&n,&m))	{mmset(dp,0);for(int i = 1; i <= m; i++)		//初始化 dp[1][i] = i;for(int i = 2; i <= n; i++)		//状态转移方程 ,自底而上的求解 {for(int j = 1; j <= m; j++){dp[i][j] = INF;for(int k = 1; k <= j; k++){dp[i][j] = min(max(dp[i-1][k-1],dp[i][j-k]) + 1,dp[i][j]);}}}printf("%d\n",dp[n][m]);}return 0;
}

 

                 

 

这篇关于浅谈动态规划优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140122

相关文章

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,