算法(一)动态规划

一、题型判断

1.输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)最大和。要求时间复杂度为O(n)。 

2.众所周知,牛妹要组织公司的出游。要准备面包和饮料。她买到的面包和饮料都是捆绑销售的,也就是说,一个大包装里面x个面包+y个饮料,花费t元。为了满足公司的要求,需要一定数量的面包和饮料。你的任务就是帮助牛妹计算,为了满足公司需要,一共最少花费多少钱。

 3.众所周知,牛妹有很多很多粉丝,粉丝送了很多很多礼物给牛妹,牛妹的礼物摆满了地板。地板是N×M的格子,每个格子有且只有一个礼物,牛妹已知每个礼物的体积。地板的坐标是左上角(1,1)  右下角(N, M)。牛妹只想要从屋子左上角走到右下角,每次走一步,每步只能向下走一步或者向右走一步或者向右下走一步每次走过一个格子,拿起(并且必须拿上)这个格子上的礼物。牛妹想知道,她能走到最后拿起的所有礼物体积最小和是多少?

 动态规划类题目判断比较容易,即在给定限制的情况下,求最大或最小值,例如以上题目中红色字体部分。专业地说就是动态规划算法包含两个基本要素:最优子结构性质、重叠子问题性质。

二、做题方法

假如一个小偷,背着一个可以装4磅物品的背包,装入下列哪些物品价值最高

 动三法1.画网格,根据题意画m*n网格,确定横纵坐标轴;2.填数据,每一个单元格就是最优解,根据题意进行填充,直到填满;3.找公式,根据单元格的值找出符合的公式,例如:cell[i][j] = c[i-1][j-1] + 1,通常在填数据的时候就可以发现公式。

解:1.画网格,根据题意,画出3*4的网格,横坐标轴为限制条件:背包的容量。纵坐标轴为待选物品。

 2.填数据(可逐行和逐列,这里选择逐行填充),当只有吉他(1磅,$1500)时,只有一种方案{吉他=1磅}=$1500可选,背包容量>=1即可,故第一行单元格中的最大值为1500。

 第一行填满后,现在音响(4磅,$3000)考虑进来,故第二行要考虑两件物品在背包容量限制的情况下,价值最大的方案。

 但是背包容量为1,2,3磅时,{音响=4磅}=$3000 {吉他=1磅,音响=4磅}=$4500 方案无法放进背包,故选原来的方案,第二行前三个单元格的值还是1500。

当背包容量为4磅时,发现{音响=4磅}=$3000方案可选且 > {吉他=1磅}=$1500,故将单元格的值填充为3000。

  第二行填满后,现在笔记本电脑(3磅,$2000)考虑进来,故第三行要考虑三件物品在背包容量限制的情况下,价值最大的方案。

同理:背包容量为1,2磅时,只有 {吉他=1磅}=$1500 方案可以放进背包,故第三行前两个单元格的值还是1500。

 当背包容量为3磅时,发现{笔记本电脑=3磅}=$2000方案可选且 > {吉他=1磅}=$1500,故将单元格的值填充为2000。

当背包容量为4磅时,发现{笔记本电脑=3磅,吉他=1磅}=$3500方案可选且 > {笔记本电脑=3磅}=$2000,故将单元格的值填充为3500。

 3.找公式,这一步比较困难,通常需要经验才能总结出正确的公式。首先,首行首列直接填充1500,然后从a[2][2]开始找规律,发现音响方案不可选,直接选择上一行单元格a[1][2]中的数据,到了a[2][4]发现可以选音响方案,即value(音响)>目前最优解a[1][4],直到a[3][4],发现可以选笔记本电脑+吉他方案,value(笔记本电脑+吉他)>目前最优解a[2][4],也就是value(笔记本电脑)+剩余容量可装物品的价值a[2][4-3]>目前最优解a[2][4]。

最后,梳理思路,总结公式如下: 

 以上方法出自算法图解,详细步骤请移步算法图解

三、刷题

1.输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)最大和。要求时间复杂度为O(n)。 例如:输入:1  -2  3  10  -4  7  2  -5  输出:18

按动三法:

 代码:

sub = 0, sum = 0
for i in list:
   if sub > 0: 
       sub += i  
   else:
       sub = i
   if sub > sum: 
       sum = sub

2. 小明依次经过1,2,3,…,n个国家买卖商品,每个国家的售价不同可以从中盈利,小明在每个国家只能进行买或卖或不交易一种活动,问最大收益是多少?例如:输入 9 7 10 1 5 输出 7

 代码:

123刷题技巧:按照动态规划类做题方法,10分钟画出网格填充并找到规律,20分钟代码实现并测试,30分钟内做不出来直接看题解,掌握方法后下次更换题目中的数据,再次按照123刷题技巧进行练习。 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值