故事开始以前  最初的那些春天 阳光洒在杨树上 风吹来 闪银光 街道平静而温暖 钟走得好慢 那是我还不识人生之味的年代
我情窦还不开  你的衬衣如雪 盼着杨树叶落下 眼睛不眨 心里像有一些话  我们先不讲 等待着那将要盛装出场的未来
人随风飘荡  天各自一方 在风尘中遗忘的清白脸庞 此生多勉强 此身越重洋 轻描时光漫长低唱语焉不详 数不清的流年
似是而非的脸 把你的故事对我讲 就让我笑出泪光 是不是生活太艰难 还是活色生香
我们都遍体鳞伤 也慢慢坏了心肠 你得到你想要的吗 换来的是铁石心肠 可曾还有什么人 再让你幻想
大风吹来了 我们随风飘荡 在风尘中遗忘的清白脸庞 此生多寒凉 此身越重洋 轻描时光漫长低唱语焉不详
大风吹来了 我们随风飘荡 在风尘中熄灭的清澈目光 我想回头望 把故事从头讲 时光迟暮不返人生已不再来----------by  朴树 《清白之年》
---------- 2020-02-02

动态规划(Dynamic Programming):

通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。

动态规划常常适用于有重叠子问题和最优子结构性质的问题。

使用动态规划最主要的是要找到状态转移方程,并确定方程的边界条件。

1. 买卖股票的最大收益(只能卖 1 次)

# 保存数组中最小的值
def sellOne(alist):minVal, maxProfit = alist[0], 0for i in range(1, len(alist)):minVal = min(minVal, alist[i])  # 获取数组中的最小值maxProfit = max(maxProfit, alist[i] - minVal)return maxProfit

2. 买卖股票的最大收益(可以卖无数次)

# 只要今天比前一天的值大时,则卖
def sellInfinite(alist):result = 0for i in range(1, len(alist)):if alist[i-1] < alist[i]:result += alist[i] - alist[i-1]return result

3. 买卖股票的最大收益(只能卖 2 次)

# 从前到后开始遍历保存收益值,从后到前遍历保存收益值,找到两数组的相加的最大和就是最大的收益
def sellTwo(alist):preProfits = [0] * len(alist)  # 第一个值为 0postProfits = [0] * len(alist) # 最后一个值为 0curMin = alist[0]for i in range(1, len(alist)):curMin = min(curMin, alist[i])  # 找到前面的最小值preProfits[i] = max(preProfits[i-1], alist[i] - curMin)curMax = alist[-1]for i in range(len(alist)-2, -1, -1):curMax = max(curMax, alist[i])  # 找到后面的最大值postProfits[i] = max(postProfits[i+1], curMax - alist[i])maxProfit = 0for i in range(len(alist)):maxProfit = max(maxProfit, preProfits[i] + postProfits[i])print(preProfits)print(postProfits)return maxProfit

4.连续数组的最大和

nums = [4, 5, -1, 3, -2, -5, 8, -5]
def getMaxSum(nums):d = [0] * len(nums)d[0] = nums[0]for i in range(1, len(nums)):d[i] = max(d[i-1] + nums[i], nums[i])  # 状态转移方程return max(d)

5.乘积最大子序列

# 求解一个序列的最大乘积,有0,和负数,正数
# 三种情况的最大值:1. 当前值; 2. 最小值* 当前; 3. 最大值* 当前
def maxProduct(nums):d = [[0, 0] for _ in range(len(nums))]d[0][0], d[0][1], res = nums[0], nums[0], nums[0]for i in range(1, len(nums)):t1 = d[i-1][0] * nums[i]   # 保存着最小值t2 = d[i-1][1] * nums[i]   # 保存着正数的最大值d[i][0] = min(nums[i], t1, t2)d[i][1] = max(nums[i], t1, t2)res = max(d[i][1], res)return res

6.最长递增子序列

# 双层循环, d[i] = {d[j] + 1, where alist[j]< alist[i] and d[i] = {d[j] + 1}
def LIS(alist):d = [1] * len(alist)for i in range(1, len(alist)):for j in range(i):if alist[j] < alist[i] and d[i] < d[j] + 1:d[i] = d[j] + 1return max(d)

7.最长连续递增子序列

def maxContinueSeq(li):d = [1] * len(li)for i in range(1, len(li)):if li[i] > li[i-1]:d[i] = d[i-1] + 1return max(d)

8.最长公共子序列

# 递推公式为:
# 当num1 == num2时, d[i][j] = d[i-1, j-1] + 1 前几项的LCS 的和
# 当num1 != num2 时,d[i][j] = max{d[i-1, j], d[i, j-1]} 求取最大值
def LCS():s1 = [1, 3, 4, 5, 6, 7, 7, 8] # 公共子序列为: 3,4,6,7,8s2 = [3, 5, 7, 4, 8, 6, 7, 8, 2]# 创建储存的二维数组, 以s2 的长度 +1 作为列, s1 + 1作为行# d = [[0 for _ in range(len(s2) + 1)] for _ in range(len(s1) + 1)]d = np.zeros(shape=(len(s1)+1, len(s2)+1), dtype='int32')for i in range(1, len(s1)+1):for j in range(1, len(s2)+1):if s1[i-1] == s2[j-1]:d[i][j] = d[i-1][j-1] + 1else:d[i][j] = max(d[i][j-1], d[i-1][j])return d[-1][-1]

9.背包问题(类似于LCS)

# 如果 背包容量大于 物品重量:W[i][j] = max(W[i-1][j], W[i-1][j-weights[i-1]] + values[i-1])  W 保存最大的价值
# 如果 背包容量小于 物品重量:W[i][j] = W[i-1][j] 前一背包重量的价值
def knapsack_problem():values = [8, 10, 6, 3, 7, 2]weights = [4, 6, 2, 2, 5, 1]C = 12 # 背包的容量# 创建一个二维数组,保存是最大的价值# W = [[0]* (C+1) for _ in range(len(weights)+1)]w = np.array(shape=(len(weights)+1, C+1), dtype = "int32")for i in range(1, len(weights) + 1):for j in range(1, C+1): # 包的重量if j >= weights[i-1]:W[i][j] = max(W[i-1][j], W[i-1][j-weights[i-1]] + values[i-1]) #else:W[i][j] = W[i-1][j]  # 前一背包重量的价值print(np.array(W))return W[-1][-1]

10.三角形的最小路径和

# 从倒数第二行开始,往上开始遍历,计算t[i+1][j] 和 t[i+1}[j+1] 的最小值
# 创建一个三角形
triangle = [[1], [4, 6], [7, 3, 5], [2, 3, 10, 12]]
def minPath(triangle):height = len(triangle)for i in range(height-2, -1, -1):for j in range(i+1):triangle[i][j] = min(triangle[i+1][j], triangle[i+1][j+1]) + triangle[i][j]print(triangle)return triangle[0][0]
print(minPath(triangle))

11.零钱兑换

# 两层遍历,外层是钱数,内层是硬币的值, (外层是行,内层是列)
coins = [1, 2, 5]
sum = 11
def coinSums(coins, sum):# 确定边界条件d = [sum+1] * (sum+1)  # 最多的可能兑换次数是 总值+1 d[0] = 0for i in range(1, sum+1):for coin in coins:if i >= coin:d[i] = min(d[i], d[i-coin]+1)print(d)return d[sum]

12.机器人走的路径数

# 当前走的数量等于 左边和上边走的数量
def pathCounts(m, n):# m, n 分别表示表格的长和宽matrix = [[1] * n for _ in range(m)] # 创建一个长是 m, 宽是 n 的二维矩阵,初始的边界值,当m n==0时,都是1,只有一条路径for i in range(1, m): # 先进行行的操作,然后进行列的操作for j in range(1, n):matrix[i][j] = matrix[i-1][j] + matrix[i][j-1] # 状态转移方程return matrix[-1][-1]

13.编辑距离

#  给定两个字符串A和B,要用最少的操作将字符串A转换成字符串B。
d[i-1][j]+1 相当于删除了A 的值
d[i][j-1]+1 相当于插入了A 的值
d[i-1][j-1]  相当于两者替换
def editPath(str1, str2):m, n = len(str1), len(str2)# d = [[0] * (n+1) for _ in range(m+1)]  # m 是行,n 是列d = np.zeros(shape=(m+1, n+1), dtype="int32")# 边界条件for i in range(1, m+1): d[i][0] = ifor j in range(1, n+1): d[0][j] = j# 状态转移方程for i in range(1, m+1):for j in range(1, n+1):if str1[i-1] == str2[j-1]:  # 判断两个字符串的值是否相同d[i][j] = d[i-1][j-1]else:d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+1)print(d)return d[-1][-1]
str1 = "horse"
str2 = "ros"  # 3 次

项目推荐:

2000多G的计算机各行业电子资源分享(持续更新)

2020年微信小程序全栈项目之喵喵交友【附课件和源码】

Spring Boot开发小而美的个人博客【附课件和源码】

Java微服务实战296集大型视频-谷粒商城【附代码和课件】

Java开发微服务畅购商城实战【全357集大项目】-附代码和课件

最全最详细数据结构与算法视频-【附课件和源码】

动态规划(练习题目)相关推荐

  1. 动态规划进阶题目之滑雪

    Problem F: 动态规划进阶题目之滑雪 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 4  Solved: 3 [Submit][Status][ ...

  2. 动态规划经典题目_动态规划经典题目:鸡蛋掉落(附视频讲解)

    题目: 思路: 先放上视频讲解 动态规划经典题目:鸡蛋掉落https://www.zhihu.com/video/1225199247848513536 纠正:视频里的状态转移方程漏写了一个+1,意思 ...

  3. 经典动态规划OJ题目:接雨水or接青豆(多种方法,附详详细思维过程、解析及源码)

    作者:非妃是公主 专栏:<算法><刷题笔记> 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 <算法>专栏系列文章 算法设计与分析复习01:主方法求递归 ...

  4. 动态规划经典题目-最小权三角剖分

    文章目录 一.题目描述 二.解题思路 1. 定义状态 2. 定义状态转移方程 3. 初始化 4. 计算方式 三.代码实现 四.执行结果 五.思考 一.题目描述 设A是顶点为0,1,-,n-1的n凸多边 ...

  5. 动态规划经典题目——最大子矩阵和

    一.题目 题目描述:现给出一个N*N矩阵,要求求出拥有最大和的子矩阵的和.例子如下图所示: 它的最大子矩阵的和为15: 二.解题思路 此题的解法与动态规划经典题目--最大连续子序列之和题目思想一样,只 ...

  6. 动态规划经典题目整理

    动态规划经典题目整理 背包问题 最长公共子串问题 连续数组最大和问题 持续增加中.... 背包问题 复杂度 O(nW)O(nW)O(nW) nnn为物品种类,WWW是背包的重量 目的:使得背包中的物品 ...

  7. 动态规划经典题目-数据压缩之图像压缩

    文章目录 一.题目描述 二.解题思路 1. 定义状态 2. 定义状态转移方程 3. 初始化 4. 计算方式 三.代码实现 四.执行结果 五.思考 一.题目描述 ​ 计算机中的图像由一系列像点构成,每个 ...

  8. 动态规划经典题目总结

    微信公众号 在算法中,动态规划题目算是比较经典的一类题目.在找工作中,不管是笔试,还是面试,我们经常会遇到用动态规划来解决问题的情况,有时候面试官还需要我们现场手写出动态规划解法的代码.因此,在求职中 ...

  9. 动态规划经典题目汇总

    http://www.cppblog.com/doer-xee/archive/2009/12/05/102629.html 转载之前先Orz一下: [s:19] Robberies http://a ...

  10. 动态规划经典题目——数塔问题

    一.题目 数塔问题 :要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 二.解题思路 动态规划解题思路可详见另一篇文章.数塔中元素用二维数组a[][]表示 ①定义状态 ...

最新文章

  1. linux 中root用户与普通用户的切换
  2. java原始模型模式_java设计模式--原始模型模式
  3. 华章IT图书书讯(2012年第9期)
  4. CocoaPods管理iOS的第三方类库
  5. c语言主范式与编码,超详细!终于搞明白KMP算法
  6. 一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出
  7. IDEA 插件开发入门教程
  8. NHibernate第一个实例
  9. MySQL深度剖析之数据在磁盘上存储(2021)
  10. mysql8.0. linux二进制_linux下安装mysql8.0(二进制方式)
  11. css/html目录
  12. 制备石墨烯流程图_科研人员制备出小扭转角度双层石墨烯
  13. Windows版本Apache+php的Xhprof应用__[2]
  14. JustAuth升级到v1.8.1版本,新增AuthState工具类,可自动生成state
  15. oracle11g dataguard
  16. 医学图像分析的发展历史
  17. 玩转Qt(14)-Qt与Web混合开发
  18. 09 Anykey右分页重新设计
  19. 什么是 ECC 内存?(memory with ECC)
  20. php如修改登陆后连接地址,两种wordpress更换后台登录界面logo图标方法

热门文章

  1. inflect java_在native线程利用JNI 反射自定义类
  2. Pytorch kaggle 房价预测实战
  3. 人脸识别会被留底吗_人脸识别会保存我们的照片吗?
  4. 去除word转pdf时的图片黑边
  5. AOPlog4j2propagation的7种事务配置
  6. vs2013编译ffmpeg之二十六 opus、shine
  7. 防控青光眼的3大武器
  8. 攻防世界的杂项高手题之神奇的Modbus
  9. ADSP-21489的图形化编程详解(6:一段 EQ,24 段 EQ,31段EQ)
  10. 计算机毕业设计Java酒店管理信息系统(源码+mysql数据库+系统+lw文档)