当前位置: 首页 > wzjs >正文

用源码建设网站模板建网站价格

用源码建设网站,模板建网站价格,网站新闻列表怎么做,东莞大岭山房价Python 动态规划(DP)套路总结 在解决算法问题时,动态规划(DP) 是一种非常常见的优化技巧,它可以通过保存子问题的结果来避免重复计算,从而减少时间复杂度。Python 提供了非常方便的语法特性&am…

Python 动态规划(DP)套路总结

在解决算法问题时,动态规划(DP) 是一种非常常见的优化技巧,它可以通过保存子问题的结果来避免重复计算,从而减少时间复杂度。Python 提供了非常方便的语法特性,使得实现动态规划变得相对简单。下面是一些常见的 Python 语法DP 解题套路

1. Python 语法和技巧

1.1 列表初始化

在 Python 中,动态规划通常需要一个数组来存储子问题的解,常见的初始化方法有:

  • 一维数组

    dp = [0] * n  # 初始化一个长度为 n 的数组,元素均为 0
    
  • 二维数组

    dp = [[0] * m for _ in range(n)]  # 初始化一个 n x m 的二维数组,元素均为 0
    
  • 处理边界情况
    如果问题涉及到无效值(例如负无穷),可以初始化为非常小的数字:

    dp = [-float('inf')] * n  # 初始化为负无穷
    

1.2 枚举排列

  • 枚举排列:通常用于动态规划中,确定所有的选择路径:

    for i in range(n):for j in range(i, n):  # 遍历子数组# 在这里进行状态转移
    
  • 利用索引生成排序后的顺序

    sorted_idx = sorted(range(len(arr)), key=lambda i: arr[i])  # 排序并记录原始索引
    

2. 动态规划(DP)解题套路

2.1 状态定义

首先,需要定义一个或多个状态,表示每个子问题的结果。常见的状态定义如下:

  • dp[i] 表示前 i 个元素的最大和或最小值
  • dp[i][j] 表示在第 i 个位置选择了 j 种操作后的最优解
  • 对于某些题目,可能需要额外记录其他信息,如最大或最小值、索引等。

2.2 状态转移方程

根据题目要求,写出从一个状态转移到另一个状态的递推公式。一般来说,转移方程会根据前一个状态的结果来更新当前状态。

2.3 边界条件

动态规划通常从小的子问题开始,需要明确边界条件:

  • dp[0] 可能是初始化的最小值。
  • dp[1] 可能是初始值或第一个元素的特殊处理。

2.4 最终解的选择

在动态规划的过程中,我们最终希望找到全局最优解(例如最大值或最小值)。通常,我们需要通过 max(dp)min(dp) 来获取结果。


3. 题目解析与动态规划解法

题目:1186. 删除一次得到子数组最大和

题目描述

给定一个整数数组 arr,返回它的某个非空子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),删除后该子数组中至少应当有一个元素。

示例
arr = [1,-2,0,3]
输出: 4

解释:

  • 我们可以选择子数组 [1, -2, 0, 3],删除 -2,得到 [1, 0, 3],最大和为 4
解法思路

对于这个问题,我们可以使用 动态规划(DP) 来处理。考虑两种情况:

  1. 不删除任何元素 的情况下,子数组的最大和。
  2. 删除一个元素后,子数组的最大和。

1. 定义状态

  • dp[i][0]:表示到第 i 个元素为止,不删除任何元素时的最大和。
  • dp[i][1]:表示到第 i 个元素为止,删除一个元素后的最大和。

2. 状态转移方程

  • dp[i][0]:可以选择加入当前元素,或者从当前元素开始一个新的子数组:
    dp[i][0] = max(arr[i], dp[i-1][0] + arr[i])
    
  • dp[i][1]:可以选择删除当前元素,或者删除前一个元素并加上当前元素:
    dp[i][1] = max(dp[i-1][0], dp[i-1][1] + arr[i])
    

3. 边界条件

  • dp[0][0] = arr[0],表示子数组只有第一个元素的情况。
  • dp[0][1] = -inf,表示第一个元素不能删除,因为至少要保留一个元素。

4. 最终解

我们需要考虑两种情况的最大值:

  • dp[i][0] 表示不删除元素的最大和。
  • dp[i][1] 表示删除一个元素后的最大和。

最终的解是 max(max(dp[i][0] for i in range(n)), max(dp[i][1] for i in range(n)))
在这里插入图片描述

代码实现
class Solution:def maximumSum(self, arr: List[int]) -> int:n = len(arr)# 初始化 dp 数组,初始值为负无穷dp = [[-2e9, -2e9] for _ in range(n)]# 初始化第一个元素的情况dp[0][0] = arr[0]dp[0][1] = float('-inf')  # 删除第一个元素不合法# 动态规划遍历for i in range(1, n):dp[i][0] = max(arr[i], dp[i - 1][0] + arr[i])  # 不删除dp[i][1] = max(dp[i - 1][0], dp[i - 1][1] + arr[i])  # 删除一个元素# 返回最大结果return max(max(dp[i][0] for i in range(n)), max(dp[i][1] for i in range(n)))
解析:
  1. 初始化:我们初始化了 dp 数组,并为第一个元素设定了边界条件。
  2. 状态转移:我们通过遍历 arr 数组,逐步计算 dp[i][0]dp[i][1],表示不删除元素和删除元素后的最大和。
  3. 返回结果:最后返回 dp 数组中最大的值,即为子数组的最大和。

时间复杂度与空间复杂度:

  • 时间复杂度O(n),我们只遍历了一次数组,并进行常数时间的计算。
  • 空间复杂度O(n),需要一个大小为 n 的动态规划数组。

总结

动态规划(DP)是解决子问题最优解的强大工具。在此题中,我们利用了动态规划的状态定义转移方程来解决删除一次元素后的子数组最大和问题。在处理此类问题时,理解状态定义与转移方程至关重要,它能够帮助我们高效地得出最终的最优解。
两种状态 没有行使权力的最大数组和 行使权力后的最大数组和
没有行使权力可以另起炉灶一个新的或者继承之前的
行使权力的可以继承之前的,或者行使权力不删集成没有行使权力的

http://www.dtcms.com/wzjs/149194.html

相关文章:

  • 红叶网站建设方案网站页面优化方案
  • 知名的集团门户网站建设企业天津seo排名费用
  • 装饰公司营销型网站设计seo网站排名优化公司哪家好
  • 建设免费网站登录网址上海百度整站优化服务
  • 四川城乡建设厅官方网站qq空间刷赞推广网站
  • 网站做反向解析爱站网seo工具
  • 做奥迪汽车网站毕业论文管理微信软件
  • 网站开发价格报表模板百度关键词如何优化
  • 做私服发布网站犯法吗成crm软件
  • 南充网站建设费用东莞seo关键词
  • 做网站产品图片素材营销模式和营销策略
  • 画册设计排版seo外贸网站制作
  • 微网站建设正规公司班级优化大师手机版下载
  • 卢湾网站建设优化大师官方网站
  • 网站建设找星火龙创建网站要钱吗
  • 简易购物网站模板十大seo免费软件
  • 做网上招聘哪个网站好教育培训机构营销方案
  • wordpress设置登录可见如何做一个网站的seo
  • 射阳做网站的公司在哪网上在哪里打广告最有效
  • 加强网站建设考察交流新手如何自己做网站
  • 营销型手机网站制作百度seo指南
  • 网站集约化建设的通知app拉新推广项目
  • 设计公司网站源码下载博客网
  • 现在建设一个网站多少钱商洛网站建设
  • app怎么推广seo按照搜索引擎的什么对网站
  • 武汉城建集团有限公司官网淘宝网店的seo主要是什么
  • 网站交给别人做安全吗国际国内新闻最新消息今天
  • 网站开通银行支付接口新媒体代运营
  • 网站域名注册步骤产品市场营销策划方案
  • 营业执照年报入口seo待遇