动态规划

  • 01背包问题
  • 钢条切割问题
  • 数字三角形问题
  • 最长公共子序问题
  • 最长上升子序列问题

01背包问题

问题描述:
给定n个物品和一个容量为C的背包,物品i的重量是Wi,其价值为Vi,背包问题是如何选择入背包的物品,使得装入背包的物品的总价值最大。
不能重复装,物品不可拆分
代码实现:

def dsf(n,total_weight):if(total_weight == 0): return 0if(n == 0): return 0if(w[n-1] > total_weight):return dsf(n-1,total_weight)else:return max(v[n-1]+dsf(n-1,total_weight-w[n-1]),dsf(n-1,total_weight))
w = [2,1,3,2]
v = [3,2,4,2]
n = 4
total_weight = 5
print(dsf(n,total_weight))

钢条切割问题

问题描述:
某公司出售钢条,出售价格与钢条长度之间的关系如下表:

问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大。

代码实现:

def cut_rod_recurision(price,length):if length==0:return 0else:res=0for i in range(1,length+1):res=max(res,price[i]+cut_rod_recurision(price,length-i))return resif __name__=="__main__":price=[0,1,5,8,9,10,17,17,20,24,30]print(cut_rod_recurision(price,9))

总结:
设长度为n的钢条切割后最优收益值为rn,可以得出递推式:
rn​=max(pn​,r1​+rn−1​,r2​+rn−2​,…,rn−1​十r1​)
可以将求解规模为n的原问题,划分为规模更小的子问题,完成一次切割后,可以将产生的两端钢条看成两个独立的钢条切割问题。

数字三角形问题

问题描述:
示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;
 
代码实现:

n = int(input())
s = []
for i in range(n):s.append(list(map(int,input().split())))def dfs(i,j):if(i > n-1 or j > n-1): return 0if(i<=n-1):dpn = s[i][j]+max(dfs(i+1,j),dfs(i+1,j+1))return dpnprint(dfs(0,0))

总结:
对于当前的数字来说,他只有选择下面(行+1,列不变) 或者 右下角(行+1,列+1)
把问题又进一步分成 一个小问题。重复递归 求取最大值。

最长公共子序问题

问题描述:

def LCS(string1,string2):len1 = len(string1)len2 = len(string2)res = [[0 for i in range(len1+1)] for j in range(len2+1)] #python 初始化二维数组 [len2+1],[len1+1]for i in range(1,len2+1):  #开始从1开始,到len2+1结束for j in range(1,len1+1):  #开始从1开始,到len2+1结束if string2[i-1] == string1[j-1]:res[i][j] = res[i-1][j-1]+1else:res[i][j] = max(res[i-1][j],res[i][j-1])return res,res[-1][-1]  #返回res[len2+1][len1+1]
print(LCS("helloworld","loop"))
# 输出结果为:
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],[0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2],[0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 3],[0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 3]], 3

总结:
利用动态规划。

下一步就要找到状态之间的转换方程。

因此可以根据这个方程来进行填表,以"helloworld"和“loop”为例:

最长上升子序列问题

问题描述:
给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数N。
第二行包含N个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N≤1000,
−109≤数列中的数≤109
输入样例:
7
3 1 2 1 8 5 6

代码实现:

n = int(input())
nums = list(map(int, input().split()))dp = [1]*(n)
res = 1
for i in range(1, n):  #判断以 nums[i] 结尾的最长子序列for j in range(i):if nums[j] < nums[i]:dp[i] = max(dp[i], dp[j]+1)  # dp[i]  表示的就是 以sums[i] 结尾的最长子序列res = max(res, dp[i])
print(res)

总结:
先写出DP方程 dp[i] = max(dp[i],dp[j]+1)

动态规划 (Python Code)相关推荐

  1. leetcode动态规划(python与c++)

    1 . 斐波那契数 class Solution:def fib(self, n: int) -> int:# if n==0:# return 0# elif n==1:# return 1# ...

  2. python code for solving eigenvalue problem by Jacobi’s method的代码

    将开发过程比较重要的代码段收藏起来,如下的代码段是关于python code for solving eigenvalue problem by Jacobi's method的代码. ''' lam ...

  3. PEP 8 – Style Guide for Python Code

    PEP 8 – Style Guide for Python Code PEP 8–Python编码规范 原文地址:https://www.python.org/dev/peps/pep-0008/ ...

  4. python code mudule,pipe,stdin,stdou,IMPORTANT

    python code mudule,pipe,stdin,stdou,IMPORTANT http://docs.python.org/library/code.html http://codeid ...

  5. PEP 8 -- Style Guide for Python Code。Python 代码规范。

    PEP 8 – Style Guide for Python Code 文章目录 PEP 8 -- Style Guide for Python Code 代码规范. PEP8 (pycodestyl ...

  6. python购买股票_动态规划python实现-买股票的最佳时机

    买股票的最佳时机(动态规划python实现) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大 ...

  7. 在翻译PEP8中学习 -- Style Guide for Python Code

    翻译了好久, 终于把这篇文档翻完了, 学到很多. 自从考研结束后就没有翻译过文章了, 一开始还以为考研英语78分的我翻译能力还可以, 结果打脸. 凡是得练习啊! 官方原文: PEP8 Style Gu ...

  8. PEP8-python代码样式指南(Style Guide for Python Code)

    文章目录 介绍(Introduction) 尽信书不如无书(A Foolish Consistency is the Hobgoblin of Little Minds) 代码布局(Code Lay- ...

  9. 爬虫-爬取感兴趣图片(python code 直接运行)

    代码只要在pycharm,使用python解释器就能爬取感兴趣的图片.(不要使用代理,否则下不了) 1.code import requests import re import osheaders ...

最新文章

  1. 用C++的类重载高精度加法,乘法和等于符号
  2. Power Query
  3. php获取上海时间代码,PHP获取星期的方法及代码
  4. Tomcat运行出现出现问题(the JRE_HOME environment variable is not defined correctly This environment variabl)
  5. 大学期末考试综合实训试题一
  6. JAVA获取JVM内存空间和物理内存空间
  7. win7蓝屏0x000000f4修复_注意:关于近期多数电脑蓝屏的处理和预防方法
  8. C++primer第十章 泛型算法 10.1 概述 10.2 初识泛型算法
  9. NAACL 2019 | 怎样生成语言才能更自然,斯坦福提出超越Perplexity的评估新方法
  10. android activity动态显示不出来,uiautomatorviewer 获取不到动态页面解决办法
  11. 信息学奥赛一本通 1001:Hello,World | OpenJudge NOI 1.1 01:Hello, World
  12. 案例29-购物车提交订单
  13. ios 代码设置控件宽高比_iOS基于代码按比例约束方法进行屏幕适配
  14. web前端开发与应用——超链接
  15. 求任意多边形面积(凹多边形和凸多边形)
  16. VS2010 学习版序列号(转)
  17. 细数黑帽seo七宗罪
  18. android ps4 远程,手机上玩PS4游戏!Remote Play扩大至所有Android设备
  19. Android集成FBReader(精简版)指南
  20. Java面向对象程序设计(四)-- 继承与多态

热门文章

  1. 【Sketch2Pose项目环境搭建】win10+Anoconda+VScode
  2. java serializable_Java基础之Serializable接口
  3. 十、获取人体骨骼关键点三维坐标——Azure Kinect DK入门
  4. 51单片机PCA模块配置
  5. android7.1.1彩蛋魅族,魅族Flyme Android 10首个内测版本已推送 强制开启90Hz彩蛋
  6. 软件工程知识点汇总(期末总复习)
  7. “金财工程”网络安全 二
  8. ajax 循环json,Ajax 遍历json
  9. 2021/11/18学习笔记:城市建成区的边界
  10. csdn邮箱手机号码解绑注销方法