动态规划 (Python Code)
动态规划
- 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)相关推荐
- leetcode动态规划(python与c++)
1 . 斐波那契数 class Solution:def fib(self, n: int) -> int:# if n==0:# return 0# elif n==1:# return 1# ...
- python code for solving eigenvalue problem by Jacobi’s method的代码
将开发过程比较重要的代码段收藏起来,如下的代码段是关于python code for solving eigenvalue problem by Jacobi's method的代码. ''' lam ...
- 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/ ...
- python code mudule,pipe,stdin,stdou,IMPORTANT
python code mudule,pipe,stdin,stdou,IMPORTANT http://docs.python.org/library/code.html http://codeid ...
- PEP 8 -- Style Guide for Python Code。Python 代码规范。
PEP 8 – Style Guide for Python Code 文章目录 PEP 8 -- Style Guide for Python Code 代码规范. PEP8 (pycodestyl ...
- python购买股票_动态规划python实现-买股票的最佳时机
买股票的最佳时机(动态规划python实现) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大 ...
- 在翻译PEP8中学习 -- Style Guide for Python Code
翻译了好久, 终于把这篇文档翻完了, 学到很多. 自从考研结束后就没有翻译过文章了, 一开始还以为考研英语78分的我翻译能力还可以, 结果打脸. 凡是得练习啊! 官方原文: PEP8 Style Gu ...
- PEP8-python代码样式指南(Style Guide for Python Code)
文章目录 介绍(Introduction) 尽信书不如无书(A Foolish Consistency is the Hobgoblin of Little Minds) 代码布局(Code Lay- ...
- 爬虫-爬取感兴趣图片(python code 直接运行)
代码只要在pycharm,使用python解释器就能爬取感兴趣的图片.(不要使用代理,否则下不了) 1.code import requests import re import osheaders ...
最新文章
- 用C++的类重载高精度加法,乘法和等于符号
- Power Query
- php获取上海时间代码,PHP获取星期的方法及代码
- Tomcat运行出现出现问题(the JRE_HOME environment variable is not defined correctly This environment variabl)
- 大学期末考试综合实训试题一
- JAVA获取JVM内存空间和物理内存空间
- win7蓝屏0x000000f4修复_注意:关于近期多数电脑蓝屏的处理和预防方法
- C++primer第十章 泛型算法 10.1 概述 10.2 初识泛型算法
- NAACL 2019 | 怎样生成语言才能更自然,斯坦福提出超越Perplexity的评估新方法
- android activity动态显示不出来,uiautomatorviewer 获取不到动态页面解决办法
- 信息学奥赛一本通 1001:Hello,World | OpenJudge NOI 1.1 01:Hello, World
- 案例29-购物车提交订单
- ios 代码设置控件宽高比_iOS基于代码按比例约束方法进行屏幕适配
- web前端开发与应用——超链接
- 求任意多边形面积(凹多边形和凸多边形)
- VS2010 学习版序列号(转)
- 细数黑帽seo七宗罪
- android ps4 远程,手机上玩PS4游戏!Remote Play扩大至所有Android设备
- Android集成FBReader(精简版)指南
- Java面向对象程序设计(四)-- 继承与多态
热门文章
- 【Sketch2Pose项目环境搭建】win10+Anoconda+VScode
- java serializable_Java基础之Serializable接口
- 十、获取人体骨骼关键点三维坐标——Azure Kinect DK入门
- 51单片机PCA模块配置
- android7.1.1彩蛋魅族,魅族Flyme Android 10首个内测版本已推送 强制开启90Hz彩蛋
- 软件工程知识点汇总(期末总复习)
- “金财工程”网络安全 二
- ajax 循环json,Ajax 遍历json
- 2021/11/18学习笔记:城市建成区的边界
- csdn邮箱手机号码解绑注销方法