代码编织梦想

动态规划算法(Dynamic Programming)是一种通过将原问题分解为相互重叠的子问题的方式来求解复杂问题的算法。

它通常用于求解最优化问题,其核心思想是将问题分解为若干个子问题,通过保存子问题的解来避免重复计算,从而实现对问题的高效求解。

算法思想:
动态规划算法的核心思想是利用子问题的最优解来求解原问题的最优解。动态规划算法通常分为以下三个步骤:

1.定义子问题:将原问题分解为若干个子问题,定义每个子问题的状态和状态之间的转移;

2.确定状态转移方程:根据子问题的状态和状态之间的转移,确定原问题的状态转移方程;

3.计算最优解:根据状态转移方程,计算原问题的最优解。

下面以一个经典的动态规划问题——最长递增子序列为例,介绍动态规划算法的Python实现。给定一个序列,求其中的一个最长递增子序列,即序列中的一段连续子序列,使得其中的元素按照从小到大的顺序排列,并且长度最大。该问题可以用动态规划算法来解决。

def longest_increasing_subsequence(nums):
    n = len(nums)
    dp = [1] * n  # 初始化最长递增子序列长度为1
    for i in range(1, n):
        for j in range(i):
            if nums[j] < nums[i]:
                dp[i] = max(dp[i], dp[j]+1)  # 状态转移方程
    return max(dp)  # 最优解为dp中的最大值

算法分析:

时间复杂度:动态规划算法的时间复杂度通常为O(n^2),其中n为问题的规模;

空间复杂度:动态规划算法的空间复杂度通常为O(n)。

需要注意的是,动态规划算法的实现通常需要使用到一个数组来保存子问题的解,因此,空间复杂度可能比较高。同时,动态规划算法的实现需要满足最优子结构和重叠子问题的性质,才能保证算法的正确性和高效性。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51705589/article/details/129631349

python动态规划dp-爱代码爱编程

文章目录 1.简介2.背包问题3.最长非降子序列 1.简介 什么是动态规划 动态规划算法通常基于一个递推公式及一个或多个初始状态。当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度,因此它比回溯法、暴力解法要快的多。 2.背包问题 问题描述 假设我们有n件物品,分别编号为1, 2…n。其中编号为i的物

Python动态规划之凑零钱-爱代码爱编程

设有1,2,5三种面值的零钱,凑齐11元,最少需要几枚硬币 使用动态规划来解决这个问题。 一、递归法 #凑零钱 def coinChange(coins,amount): def dp(n): if n==0: #base case return 0 if n<0:

python动态规划实现硬币求解问题-爱代码爱编程

动态规划 动态规划策略通常用于求解最优化问题,在这类问题中,可能会有许多行解,每一个解都对应一个值,我们希望找到具有最优值的那个解。 动态规划原理:动态规划算法将待求解问题拆分成一系列相互交叠的子问题,通过递推关系定义各子问题的求解策略,并随时记录子问题的解,最终获得原始问题的解,避免了对交叠子问题的重复求解。 动态规划要领: 动态规划中有三要素:最优子

矩阵连乘python动态规划实现-爱代码爱编程

import numpy as np """ 对于矩阵{A_0,A_1,... ...,A_n} 对应阶数{P_0,P_1,... ...,P_n,P_n+1} 它们的行列表达为 A_0 = P_0 * P_1 """ def matrixChain(p, n=1, memo=None, seq=None): # size = len

Python动态规划案例问题1-爱代码爱编程

一.什么是动态规划 动态规划是一种解决复杂问题的方法,它将复杂问题分解为一系列更简单的子问题,每个子问题只解决一次,并存储它们的解。 二.动态规划组成部分 1.确定状态 简单的说,解动态规划的时候需要开一个数组,数组的每个元素f[i]或者f[i][j]代表什么。确定状态需要最后一步以及子问题两个基础。 2.转移方程 一般为列表元素的等式 3.

【Python动态规划】--爬楼梯-爱代码爱编程

动态规划–爬楼梯 爬楼梯 题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 示例 2: 输入: 3 输出: 3 【分析】 题目中说只能爬一个台阶或两个台阶 那么:爬到第N阶方法数=再 爬一个台阶的方法+

python动态规划-斐波那契数_漫漫行程路的博客-爱代码爱编程

# 1 1 2 3 5 8 # 暴力递归 已知数学公式,只需要直接写明base case 然后写明条件即可 def func01(n): if n == 1: return 1 if n == 2: return 1 return func(n-1) + func(n-2) # 记忆化搜索 #

动态规划(python)_zengwh_02的博客-爱代码爱编程

一、动态规划 1、动态规划的定义 动态规划是将原始问题划分为若干个子问题,通过仅求解每个子问题一次,并将其结果保存在一个表结构中,以后用到的时候直接存取的方法。 2、适用于动态规划的问题 ① 优化子结构 优化子结构,即一个问题的优化解包含了子问题的优化解。 ② 重叠子问题 在问题求解过程中,很多子问题的解被多次使用。 3、动态规划算法步骤

python动态规划算法实例详解_热爱科技的刘同学的博客-爱代码爱编程

文章目录 python动态规划算法实例详解一、什么是动态规划?二、新视角:从斐波那契数列看动态规划三、实例扩展(爬楼梯)1. 题目描述2. 示例示例1示例2 3. 解析4. 代码实现 四、结语

蓝桥云课——路径 python(动态规划)-爱代码爱编程

写了一个多小时思路,最后准备提交了,系统给我卡了一下,啥也没保存,心态炸了,贴个ac代码吧,烦死了 import math # 最短路径 = min(最短路径, 另一条最短路径 + 边长度) dp = [float('inf')] * 2022 # 因为求最短路径,所以把dp值全设为最大 dp[1] = 0 # 1到1的最短路径为0 def fun

python动态规划-爱代码爱编程

问题: 现在有一个背包,总容量为bag_weight, 现在有n种物品,每种物品只有1件,它们的重量w与价值v如下,请问怎么选取物品,可以使得背包装的物品价值最大? n = 6 bag_weight = 10 w = [2, 2, 3, 1, 5, 2] v = [2, 3, 1, 5, 4, 3] 实现思路: value[i][j]:表示当背包剩