不能放弃治疗,每天都要进步!!

什么时候使用动态规划呢?

1. 求一个问题的最优解 
2. 大问题可以分解为子问题,子问题还有重叠的更小的子问题 
3. 整体问题最优解取决于子问题的最优解(状态转移方程) 
4. 从上往下分析问题,从下往上解决问题 
5. 讨论底层的边界问题

实例1:割绳子问题

题目:给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m]. 请问k[0]k[1]…*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18.

思路:f(n)=max{f(i)f(n-i)},想发与实现是2个方法,想的时候是递归,实现的时候是从底层至最上面。

实现:1米最1,2米最大是2,3米最大是3,4米最大是4,依次类推,求n米的最大切割

算法复杂度O(n2)

# -*- coding: utf-8 -*
def maxCutString(length):
#这三行代表输入的绳子长度为1,2,3时,发生切割动作,最大的乘积if length < 2:return 0if length == 2:return 1if length == 3:return 2#绳子不断切割,当切割到长度为1,2,3时,不能继续切割,直接返回1,2.3arr=[0,1,2,3]#记录绳子长度为i时候的最大乘积arr[i]for i in range(4,length+1):maxs=0for j in range(1,i/2+1):mult=arr[j]*arr[i-j]if maxs<mult:maxs=multarr.append(maxs)return arr[length]print maxCutString(8)

View Code

实例2:最大连续子项和

思路:

实现:maxtmp记录临时子项和,遇到的每一个数不断累加;当maxtmp为负时,清空,从下一个数开始,从新累加;当累加的数大于maxsum时,将值赋给maxsum

复杂度:O(n)

#-*- coding: utf-8 -*
#!usr/bin/python
def maxSum(lists):maxsum=0maxtmp=0for i in range(len(lists)):if maxtmp<=0:maxtmp=lists[i]else:maxtmp+=lists[i]if maxtmp > maxsum:maxsum=maxtmpreturn maxsum
lists=[1,3,-3,4,-6,5]
print maxSum(lists)

View Code

还有一种暴力求解,双层遍历,复杂度O(n2)

#-*- coding: utf-8 -*
#!usr/bin/python
def maxSum(lists):maxsum=0for i in range(len(lists)):maxtmp=0for j in range(i,len(lists)):maxtmp+=lists[j]if maxtmp > maxsum:maxsum=maxtmpreturn maxsum
lists=[1,3,-3,4,-6,5]
print maxSum(lists)

View Code

实例3:放苹果

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

思路:f(m,n) =f(m,n-1)+f(m-n,n) 

设f(m,n) 为m个苹果,n个盘子的放法数目,则先对n作讨论,

当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。即if(n>m) f(m,n) = f(m,m)  

当n<=m:不同的放法可以分成两类:

    1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1); 

    2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即f(m,n) = f(m-n,n).

而总的放苹果的放法数目等于两者的和,即 f(m,n) =f(m,n-1)+f(m-n,n)

递归出口条件说明:

    1.当n=1时,所有苹果都必须放在一个盘子里,所以返回1;

     2.当没有苹果可放时,定义为1种放法;

      递归的两条路,第一条n会逐渐减少,终会到达出口n==1;

      第二条m会逐渐减少,因为n>m时,我们会return f(m,m) 所以终会到达出口m==0

#!usr/bin/python
def f(m,n):if (m==0 or n==1):return 1if m<n:return f(m,m)else:return f(m,n-1)+f(m-n,n)
lines=map(int,raw_input().strip().split())
print f(lines[0],lines[1])

View Code

实例四:青蛙跳台阶问题

1.如果青蛙可以一次跳 1 级,也可以一次跳 2 级。问要跳上第 n 级台阶有多少种跳法?
思路:f(n)=f(n-1)+f(n-2)             第n级别只能由n-1级别和第n-2级别的青蛙跳到

#-*- conding: utf-8 -*
#递归解法
def f(n):if n==1:return 1elif n==2:return 2else:return f(n-1)+f(n-2)
print f(8)
#自下到上解法
def f2(n):arr=[0,1,2]for i in range(3,n+1):tmp=arr[i-1]+arr[i-2]arr.append(tmp)return arr[n]
print f2(8)

View Code

2.如果青蛙可以一次跳 1 级,也可以一次跳 2 级,一次跳 3 级,…,一次跳 nn 级。问要跳上第 n级台阶有多少种跳法?

#.*. coding:utf-8 -*
#递归解法
def f(n):if n==1:return 1else:return 2*f(n-1)
print f(8)
#自下而上解法
def f2(n):arr=[0,1,2]for i in range(3,n+1):tmp=2*arr[i-1]arr.append(tmp)return arr[n]
print f2(8)

View Code

转载于:https://www.cnblogs.com/students/p/9601036.html

python----动态规划相关推荐

  1. python动态规划图解_动态规划案例之python实现(一)

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两 ...

  2. python 动态规划_DP动态规划(Python实现)

    前言_ 我们遇到的问题中,有很大一部分可以用动态规划(简称DP)来解. 解决这类问题可以很大地提升你的能力与技巧,我会试着帮助你理解如何使用DP来解题. 这篇文章是基于实例展开来讲的,因为干巴巴的理论 ...

  3. python 动态规划 回溯_回溯算法 - 全排列算法实现(pythondart)

    回溯算法 , 就是 穷举 解决一个回溯问题,实际上就是一个决策树的遍历过程. 路径: 也就是已经做出的选择 选择列表: 也就是你当前可以做的选择 结束条件: 也就是到达决策树底层,无法再做选择的条件. ...

  4. python动态规划详解_python----动态规划

    不能放弃治疗,每天都要进步!! 什么时候使用动态规划呢? 1. 求一个问题的最优解 2. 大问题可以分解为子问题,子问题还有重叠的更小的子问题 3. 整体问题最优解取决于子问题的最优解(状态转移方程) ...

  5. Python | 动态规划解决“返回第n个丑数”

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 给你一个整数 n ,请你找出并返回第 n 个 丑数 .丑数 就是只包含质因数 2.3 和/或 ...

  6. Python——动态规划

    目录 准备知识 递归 什么是动态规划 动态规划题目的解题思想 动态规划分类 参考资料 准备知识 递归 python递归 什么是动态规划 官方解释:动态规划与分治法相似,都是通过组合子问题的解来求解原问 ...

  7. Python动态规划

    动态规划算法(Dynamic Programming)是一种通过将原问题分解为相互重叠的子问题的方式来求解复杂问题的算法. 它通常用于求解最优化问题,其核心思想是将问题分解为若干个子问题,通过保存子问 ...

  8. python 动态规划 旅行商问题_旅行商问题动态规划解法(python版)

    2019年华为实习生第二场笔试第二题是个旅行商问题,虽然只有5个点可以import itertools产生排列遍历5!=120情况求解(当然也可以写个递归自己生成排列),还是查了下动态规划的解法. 原 ...

  9. python动态规划详解_经典动态规划例题整理(Python版)

    由于本人的算法基础较为薄弱,所以在这里整理一下自己的做过的题,使自己能够随时随地回顾温习. 然后,本篇文章将会持续更新自己遇到的一些比较经典动态规划的题目,大家如果对代码有任何问题,直接在文章下面评论 ...

  10. python 动态规划 数塔_数塔问题,简单的动态规划算法

    /* 数塔问题: 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走, 一直走到底层,要求找出一条路径,使路径 ...

最新文章

  1. C#WinForm制作异形窗体/控件
  2. [20180502]PLDEVELOP与存储过程调试.txt
  3. 网络部署过程中_郑州萤火云SEO网络优化:SEO过程中的容易犯的错误
  4. char *c = abc和char c[]=abc
  5. 分词相关技术(转载)
  6. IoT安全系列-如何发现攻击面并进行测试(物联网安全)
  7. access vba 用recordset读取表中数据的简单方法
  8. 北林oj-算法设计与分析-Don‘t touch my cake(题意+代码)
  9. JavaScript高级程序设计笔记 - 第四章 变量 作用域 内存问题
  10. App IM 之 环信
  11. 图标缩排和悬浮突显的简单实现
  12. 在BizTalk Server 2006 R2 中调用 WCF Services – Part 3
  13. 第四季-专题19-I2C驱动程序设计
  14. CentOS中自定义yum仓库和配置文件
  15. 小鸟云数据盘如何进行挂载?
  16. hbase snappy 安装_Hadoop HBase 配置 安装 Snappy 终极教程
  17. python从文件中读取数据_【Python】从文件中读取数据
  18. shiro学习之错误 No realms have been configured! One or more realms must be present to execute an authori
  19. Log4j2写日志的艺术
  20. 【NOIP2017提高A组集训10.25】摘Galo (树形dp)

热门文章

  1. 悬镜服务器系统,悬镜服务器卫士V3.3.0.3961更新通知
  2. java接收前台tex格式t数据_java 下载文件时,设置response.setContentType 根据文件类型...
  3. User-mode Linux (简体中文)
  4. 在HTML5 canvas里用卷积核进行图像处理
  5. Citrix XenApp 5.0 Uninstall
  6. Docker--------企业级最佳入门
  7. void类型及void指针
  8. Android进阶——深入浅出Handler(一)
  9. Ubunut14.04安装wps最新方法
  10. 收藏10个2012年最新发布的jQuery插件