关于 DP 的一些内容

部署运行你感兴趣的模型镜像
0.关于
        动态规划是编程解题的一种重要手段。1951 年美国数学家 R.Bellman 等人,根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。与此同时,他提出了解决这类问题的“最优化原理”,从而创建了解决最优化问题的一种新方法:动态规划。
        动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。
        我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。

1.基本概念
        · 阶段:把所给问题的求解过程恰当地分成若干个相互联系的阶段,以便于求解。过程不同,阶段数就可能不同。描述阶段的变量称为阶段变量,常用 k 表示。阶段的划分,一般是根据时间和空间的自然特征来划分,但要便于把问题的过程转化为多阶段决策的过程。
        · 状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因素。通常一个阶段有若干个状态,状态通常可以用一个或一组数来描述,称为状态变量。
        · 决策:表示当过程处于某一阶段的某个状态时,可以做出不同的决定,从而确定下一阶段的状态,这种决定称为决策。不同的决策对应着不同的数值,描述决策的变量称决策变量。
        · 状态转移方程:动态规划中本阶段的状态往往是上一阶段的状态和上一阶段的决策的结果,由第 i 段的状态 f(i) ,和决策 u(i) 来确定第 i+1 段的状态。状态转移表示为 F(i+1) = T(f(i),u(i)) ,称为状态转移方程。
        · 策略:各个阶段决策确定后,整个问题的决策序列就构成了一个策略,对每个实际问题,可供选择的策略有一定范围,称为允许策略集合。允许策略集合中达到最优效果的策略称为最优策略。

动态规划必须满足最优化原理与无后效性。

        · 最优化原理:“一个过程的最优决策具有这样的性质:即无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作为初始状态的过程而言,必须构成最优策略”。也就是说一个最优策略的子策略,也是最优的。
        · 无后效性:如果某阶段状态给定后,则在这个阶段以后过程的发展不受这个阶段以前各个状态的影响。

举个栗子
来看一道题目。

可怜的可乐机要回家,已知小可乐机在 左下角 (1,1) 位置,家在 右上角 (n,n) 坐标处。小可乐机走上一个格子 (i,j) 会花费一定的体力 a[i][j],而且小可乐机只会往家的方向走,也就是只能往上,或者往右走。小可乐机想知道他回到家需要花费的最少体力是多少, 求你帮帮小可乐机吧qwq

例如下图所示,格子中的数字代表走上该格子花费的体力:
可乐机回家.png
对于该图来说,最优策略已在图上标出,最少花费体力为:3 + 2 + 4 + 3 = 123 + 2 + 4 + 3 = 12。

我们把走到一个点看做一个状态,对小可乐机来说,走到一个点只有两种方式,一个是从下面走到该点,一种是从左边走到该点。那么点 (i,j) 要么是从 (i-1,j) 走到 (i,j),要么是从点 (i,j-1) 走到 (i,j)。

所以从哪个点走到 (i,j) 就是一个 决策。接下来,我们用 dp(i,j) 来代表走到点 (i,j) 一共花费的最少体力。
我们需要花费最少力气走到家,所以可以得到状态转移方程:dp(i,j) = min(dp(i-1,j), dp(i,j-1)) + a[i][j] 。根据转移方程,我们可以推出走到每个点花费的最少体力。

对于图中的边界点,要在转移前加上判断是否为边界,如:点 (1,3) 只能从点 (1,2) 走过来,点 (3,1) 只能从点 (2,1) 走过来等等。

动态规划的题目的核心是写出状态转移方程,对于一个动态规划的题目,如果我们能写出转移方程那么代码实现就变得简单多了。大部分的动态规划题目,在计算出转移方程后,可以用类似于递推的循环结构,来写出代码。

主要代码

int a[100][100]; // a数组代表在点(i,j)花费的体力
int dp[100][100]; // dp数组代表走到点(i,j)一共花费的最少体力
dp[1][1] = 0;
for (int i = 1; i <= n; i++)
{
    for (int j = 1; j <= n; j++)
    {
        if (i == 1 && j == 1)
        {
            continue;
        }
        else if (i == 1) //边界点
        {
            dp[i][j] = dp[i][j-1] + a[i][j];
        }
        else if (j == 1)  //边界点
        {
            dp[i][j] = dp[i-1][j] + a[i][j];
        }
        else
        {
            dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + a[i][j]; //转移方程
        }
    }
}

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
### 回答1: Profibus是工业通信领域中广泛使用的一种通讯协议,分为Profibus DP和Profibus PA两种。这里主要介绍Profibus DP通讯协议的内容。 Profibus DP通讯协议采用了分布式控制系统(DCS)和现场总线(Fieldbus)技术,可用于实现具有实时性和高可靠性的自动化控制系统。它采用了基于Master/Slave的架构,其通讯方式为同步通讯。 Profibus DP通讯协议提供了多种通讯速率,包括9.6Kbps、19.2Kbps、45.45Kbps、93.75Kbps、187.5Kbps、500Kbps、1.5Mbps和12Mbps,可以根据实际需求进行选择。同时,它还提供了多种传输介质,包括RS-485、光纤和扩展以太网(Ethernet/IP)。 在Profibus DP通讯协议中,每个站点被赋予一个独一无二的地址。Master站有权访问所有Slave站点,Slave站点只能响应Master站的指令。Master站对Slave站进行轮询,以获取初始的传感器和执行器信息,并对其进行控制和监测。每个Slave站点可连接多个传感器和执行器,具有高度的灵活性和可扩展性。 Profibus DP通讯协议还提供了多种错误检测和纠错机制,以确保高可靠性和安全性。例如,它采用了循环冗余校验(CRC)和检验和机制,以检测传输过程中的数据传输错误,同时提供了重发机制和带有超时功能的机制,以确保数据传输的完整性和正确性。 总之,Profibus DP通讯协议是一种成熟、可靠、高效、安全的现场总线通讯协议,被广泛应用于工业自动化和控制系统中。 ### 回答2: Profibus DP是由德国西门子公司提出的一种数据传输协议,它是现代工业控制系统中应用广泛的一种通讯协议。它的全称是Process Field Bus,用于控制分布在不同位置的设备,实现自动化控制系统的高效、可靠和灵活的通讯控制。 Profibus DP采用了物理层和数据链路层两层结构,支持点对点、点对多点和广播通讯方式。其数据传输速率高达12Mbps,可以实现实时控制和数据采集,具有高效性和稳定性。同时,它还能自适应传输距离,达到最佳的通讯效果。 该协议采用周期性轮询机制,控制器通过向设备发送指令,来获取设备的状态信息和控制指令。另外,Profibus DP还支持热插拔设备,这使得设备的更换和维护变得非常便捷。 Profibus DP协议的应用非常广泛,包括工业自动化、机器人控制、自动化生产线、大型机械设备、能源管理系统等多个领域。由于其高效、灵活和可靠的特点,Profibus DP将在工业自动化领域中得到广泛应用。 ### 回答3: PROFIBUS DP(Process FieldBus- Decentralized Periphery)是一种工业现场总线通讯协议,用于在现场设备之间进行数据交换。PROFIBUS DP能够满足现代工厂自动化系统中多种工业小型控制设备、传感器和执行器之间高效可靠的通信要求。 PROFIBUS DP通讯协议中,设备间通讯采用Master/Slave的方式进行,主节点(Master)具有数据请求和控制权,从节点(Slave)只能被动响应主节点的请求,从节点数量的上限取决于主节点所能支持的从节点数量。 PROFIBUS DP通讯协议包含的主要内容包括物理层、数据链路层和应用层三个部分。在物理层,PROFIBUS DP采用RS485电缆传输信号,其数据传输速度可达到9.6Mbps,最远传输距离可达到12公里。 在数据链路层,PROFIBUS DP采用了的数据帧格式,包括了启动帧、数据帧和结束帧。在启动帧中,主节点向从节点发送命令信息,从节点向主节点发送响应信息,其中包括了数据和控制信息。 在应用层,PROFIBUS DP通讯协议定义了一组标准化的命令和数据格式。主节点可以向从节点发送读、写、控制和状态查询等命令,同时还支持多播、广播等多种通讯方式。 总之,PROFIBUS DP通讯协议是一种高效可靠的现场总线通讯协议,广泛应用于工业领域的机器人、流程控制、能源管理等领域,为自动化控制系统的实现和优化提供了有力的支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值