上篇,我们提到,遇到问题,首先根据定义写出笨方法,找出依赖关系(有些题这一步就不太简单,要自己归纳关系),然后进行优化,下面,我们通过几道此方面的经典的,较为简单的二维题目进行讲解。

开始根据题来说明:

第一个萌新题

给定数组arr,  arr  中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,  再给定一个整数aim 代表要找的钱数,求组成aim 的最少货币数。

  [举例]

  arr=[5,2,3],  aim=20。

  4 张5 元可以组成20 元,其他的找钱方案都要使用更多张的货币,返回4。

arr=[5,2,3],  aim=0。

  不用任何货币就可以组成0 元,返回0。

  arr=[3,5],aim=2。

  根本无法组成2 元,钱不能找开的情况下默认返回-1。

(你要是想贪心就贪吧,反正我不贪)

定义f(a,b)代表的是a面值及之前的货币,组成b元的最少张数。那f(arr[-1],aim)就是我们想求的答案。现在分析,怎样通过前面的状态推出结果?对于货币arr[-1],我们可以一张都不用,那最少张数其实就是f(arr[-2],aim),我们也可以用一张arr[-1],最少张数就可能是f(arr[-2],aim-arr[-1])+1(用之前的钱组成aim-arr[-1]元钱,然后加一张arr[-1]),同理,我们可以用两张arr[-1],或者更多,直到下一个就超过aim的时候。所以我们应该在所有情况中选最小的,

归纳表达式:

f(a,b)=min(f(arr[a-1],b-k*arr[a])+k),k>=0,且b-k*arr[a]>=0

当然,以前也提到过,直接递归我们会有大量重复计算,所以需要记下来之前的结果供我们使用。有两个参数代表现在的状态,所以生成二维表。

l=[[0 for i in range(len(arr))] for i in range(aim+1)]#

我们看,f(arr[a],b)和谁有关?和上一行,也就是arr[a-1]那一行的很多左边元素有关。

所以确定打表顺序,从上到下,从左到右,打表,一个一个打,l[a][b]=min(f(a-1,b-k*arr[a])+k),依次推出l[a][b],右下角就是答案。

 

但是,还是有相当多的重复计算,我们的l[a][b-arr[a]]其实就是根据除了l[a-1][b]的左边那些元素求的的最小值

所以l[a][b]=min(l[a][b-arr[a]]+1,l[a-1][b])。

其实和左边和上边元素相关的背包,还有一些别的题,都是如此。对于本物品,当前决策就是拿或不拿,以前的最优情况

l[a][b-arr[a]]l[a-1][b]已经有了。不用管的。结合当前状态的定义,就明白了。

至此,时间优化到严格o(a*b),空间o(a*b),空间还能优化到o(min(a,b)),下一个题讲压缩方法。

第二个萌新题

给一个由数字组成的矩阵,初始在左上角,要求每次只能向下或向右移动,路径和就是经过的数字全部加起来,求可能的最小路径和。

1  3  5  9

8  1  3  4

5  0  6  1

8  8  4  0

路径:1 3 1 0 6 1 0路径和最小,返回12

生成和矩阵相同大小的二维表DP,用来记录当前的最小路径和

(以后也不分析暴力的时间复杂度了)

对于普遍的位置i,j,只有i-1,j和i,j-1这两个位置可以一步走到这里,所以

DP[i,j]=min(DP[i,j-1],DP[i-1,j])+L[i,j]

压缩:我们发现,除了这个位置上本身的数,DP[i,j]只和DP表中左边和上边的值有关,所以可以生成长度为矩阵较小边长一维表,用两层循环。注意顺序,从左向右打表,只有这样,左边的那个元素才是被更新过的,才是本行的左边那个元素。

最左边的DP值是直接累加的,其他位置

For i 0 to 高度:

    For j 0 to 宽度

DP[j]=min(DP[j-1],DP[j])+L[i,j]

时间不变,空间优化到o(较小边长)

第三道萌新题

题干和第一题一样,请返回所有的还钱方法有多少种

经过一二题,应该自己会做了。

(请记住:一般问方法的题目,只需把式子中max或者min改为sum即可)

n=int(input())
dp=[0]*(n+1)
dp[0]=1
tmp=[1,5,10,20,50,100]
for kk in tmp:for i in range(kk,n+1):dp[i]+=dp[i-kk]
print(dp[n])

简单暴力到dp的优化(入门篇)相关推荐

  1. 简单暴力到dp的优化(中级篇)

    下面再放三道我比较喜欢的,需要好好写一下的题. 第一题比较水 1. White Cloud is exercising in the playground. White Cloud can walk ...

  2. 简单暴力到dp的优化(初级篇)

    一.一维非脑残 1 一个只包含'A'.'B'和'C'的字符串,如果存在某一段长度为3的连续子串中恰好'A'.'B'和'C'各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的.例如: BAAC ...

  3. 简单暴力到dp的优化(萌新篇)

    想写一系列文章,总结一些题目,看看解决问题.优化方法的过程到底是什么样子的. 系列问题一:斐波那契数列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F( ...

  4. 简单的恶意样本行文分析-入门篇

    开篇引题,此篇文章为入门入门文章,里面的内容为后续软件安全分析铺垫,有点东西,但是不多,所以大家觉得有用就看一眼,觉得无用就不看哈,别喷:此类应用场景呢,其实就是恶意样本行为分析.在遇到后门.应急响应 ...

  5. 「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)

    [mysql优化专题]:本专题全文围绕mysql优化进行全方位讲解,本篇为优化入门篇,让大家知道为什么要优化,究竟在优化什么. 优化,一直是面试最常问的一个问题.因为从优化的角度,优化的思路,完全可以 ...

  6. Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)

    Git快速入门篇-- Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程) 前言:我们平时在整理代码的时候,尤其是与别人一起开发项目的时候,常常涉及到代码的更新,因此代码版本问 ...

  7. 猿编程python代码_程序猿编程课堂 Python学习之入门篇3:简单的数据类型

    1. 什么是数据类型? 我们知道编程就是编写程序解决某个问题,而任何能使用编程来解决的问题都是能够提取或者转换出相应的数据,只是数据的表达形式是不一样的,而这表达形式就是数据类型. 比如,数学中的数字 ...

  8. 不用编程超简单的自动化测试工具:Airtest安装使用入门篇

    一.背景 很多刚入行或从其他行业转行做测试的同学,日复一日每天做点工已经点得疲惫和麻木,觉得做测试和在厂子里打螺丝没太大区别.也想着做一做自动化测试,奈何自己看着代码就头痛,当初就是因为不喜欢编程才选 ...

  9. Android学习路线_入门篇(一)编写简单的APP

    Android学习入门的目标就是能够编写出一个完整的APP,有可交互的界面,有基本的功能,有本地的数据库,有与后台的数据交换.在本文我们会了解到如何在AndroidStudio中新建.运行.打包一个A ...

最新文章

  1. linux 创建crontab文件位置,[基础教程]linux系统的crontab计划任务添加和删除
  2. JFree chart
  3. linux 22.3 终端,Linux系统服务Day.22
  4. .NET应用程序中异步调用Web Service的几种方法 come from: veryhappy(wx.net)
  5. 饥荒联机版连不上服务器_饥荒联机版无法连接klei服务器及刷不出服务器解决方法一览...
  6. final方法覆盖与重载问题以及不同访问权限问题
  7. 中心静脉导管行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. ue 新建html,第四课 开发uehtml官网响应式静态页面(示例代码)
  9. 网页视频流m3u8/ts视频下载
  10. Activiti 工作流引擎 详解
  11. 中文文本情感分析:基于机器学习方法的思路
  12. Office/Wps日常操作小技巧
  13. 中山大学3D游戏设计读书笔记 unity3D Note2
  14. android一些可用实例2014收藏
  15. python 获取qq群成员信息_用Python编写工具获取QQ群成员的昵称和号码,使用,及,小...
  16. 这样去做信用贷款违约预测项目,效果提升明显
  17. The Pilots Brothers' refrigerator开灯问题
  18. Mybatis-plus读取(GeoJson)和保存Postgis geography数据
  19. 系统学习深度学习(十五)--AlexNet译文
  20. ECU存储安全之深入理解Flash

热门文章

  1. AC_CHECK_LIB的工作原理
  2. 软件测试菲律宾,英雄联盟手游菲律宾测试资格怎么得 菲律宾测试资格获取攻略[多图]...
  3. 南京大学c语言试卷,2007年4月南京大学C语言期中试题.doc
  4. php公交查询系统源代码,基于Smarty公交查询系统的设计与实现(PHP,MySQL)
  5. 架构、框架和设计模式关系
  6. 【转】C#打包文件夹成zip格式(包括文件夹和子文件夹下的所有文件)
  7. ros amcl 参数配置
  8. Python 数据分析三剑客之 Pandas(一):认识 Pandas 及其 Series、DataFrame 对象
  9. 高通modem启动过程_苹果首次承认正自研基带芯片,高通要被抛弃了?
  10. 【牛客 - 370 I 】Rinne Loves Xor(按位前缀和,异或)