今天的题目不是leetcode上面的。只是觉得动态规划还是不算很熟练,就接着找了点DP的题练练

最长递增子序列的长度

题目的意思:传入一个数组,要求出它的最长递增子序列的长度。例如:如在序列1,-1,2,-3,4,-5,6,-7中,最长递增序列为1,2,4,6,所以长度为4。

分析:这道题我们可以用动态规划来做。对于数组的前i个元素,记L(i)为前i个最长递增子序列的长度。我们可以得到状态转移方程:L(i) = max(L(j))+1, 其中j<i, a[j]<a[i]. 这个解法比较容易想出来。可是这个解法的时间复杂度有点高(O(n^2))。下面是另一种解法,利用了二分查找(O(logn)),时间复杂度是O(nlogn)

def maxlong(li):
maxLong = [0 for i in range(len(li))]
maxLong[0] = li[0]
leng = 1 for i in range(1,len(li)):
if li[i] > maxLong[leng-1]:
maxLong[leng] = li[i]
leng += 1
else:
pos = biSearch(li[i], leng, maxLong)
maxLong[pos] = li[i]
return leng def biSearch(value, length, maxLong):
left = 0
right = length-1
while left <= right:
mid = (left+right)//2
if maxLong[mid] > value:
right = mid-1
elif maxLong[mid] < value:
left = mid+1
else:
return mid
return left

从左往右递增再递减的数列

题目的意思:从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。

分析:这道题是上面那道题的变体。我们可以把这道题这样看:

筛除数字后,数组的0~i位是递增数列,数组的(len(li)-1)~i位是递增数列。

其实这道题等效于求出这两个数列的递增数列长度(a[i],b[i]),再求出min(len(li)-a[i]-b[i]+1)

该方法利用了前一道题求最长递增子序列长度的方法。

def maxlong(li):
maxLong = [0 for i in range(len(li))]
maxLong[0] = li[0]
leng = 1 for i in range(1,len(li)):
if li[i] > maxLong[leng-1]:
maxLong[leng] = li[i]
leng += 1
else:
pos = biSearch(maxLong, leng, li[i])
maxLong[pos] = li[i]
return leng def biSearch(li, length, value):
left = 0
right = length-1
while left <= right:
mid = (right + left)//2
if li[mid] > value:
right = mid -1
elif li[mid] < value:
left = mid + 1
else:
return mid
return left def mindelete(li):
a = [0 for i in range(len(li))]
b = [0 for i in range(len(li))]
c = 0 for i in range(len(li)):
li_a = li[:i+1]
a[i] = maxlong(li_a) li_b = li[:i:-1]+[li[i]]
b[i] = maxlong(li_b) for i in range(len(li)):
c = max(c, a[i]+b[i]) return len(li) -c +1

leetcode算法刷题(五)——动态规划(三)的更多相关文章

  1. leetcode算法刷题(二)——动态规划(一)

    上次刷了五六道题,都是关于string处理的,这次想换个知识点刷一下,然后再回头刷string的题,当做复习.. 这几天主要会选择动态规划的题目,因为以前从没刷过这方面的东西,很多东西都不是很懂..就 ...

  2. leetcode算法刷题(四)——动态规划(二)

    又到了晚上,动态规划,开刷! 第121题 Best Time to Buy and Sell Stock 题目的意思:给予一个数组price,表示特定股票在某天的股价,里面第i个数表示第i天的价格.只 ...

  3. leetcode 算法刷题(一)

    今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...

  4. leetcode算法刷题(三)

    今天在刷了几道简单的动态规划后,又看了看string方面的题 第五题 Longest Palindromic Substring 题目的意思:求一个字符串的最长回文子串 分析:开始,我的想法是,现在字 ...

  5. Leetcode算法刷题:217和219题 Contains Duplicate

    从题目名字就可以看出这两道题是相似的,219是217的加强版 217:Contains Duplicate 题目 给予一个数组,判断是否有重复的元素.如果有就返回True,没有就返回False.以下是 ...

  6. Leetcode算法刷题:第100题 Same Tree

    Same Tree 题目 给予两棵二叉树,判断这两棵树是否相等(即各节点的值都一样) 解题思路 分别遍历两棵二叉树,并用列表分别存储这两棵树的节点的值,比较这两个列表就可以了 class Soluti ...

  7. Leetcode算法刷题:第14题 Longest Common Prefix

    Longest Common Prefix 题目 给予一个列表,元素为字符串,写一个程序找出最长公共前缀 解题思路 先比较两个字符串,如果第一个字符不一样,则返回空值,比较完成后,用这个公共字符串和下 ...

  8. Leetcode算法刷题:第112题 Path Sum

    Path Sum 题目 给予一个二叉树,和一个值su,寻找是否有一个从根节点到叶节点的和为su,有则返回True,没有为False.比如: 5 / \ 4 8 / / \ 11 13 4 / \ \ ...

  9. leetcode top-100-liked-questions刷题总结

    一.起因 宅在家中,不知该做点什么.没有很好的想法,自己一直想提升技能,语言基础自不必言,数据结构还算熟悉,算法能力一般.于是乎,就去刷一通题. 刷题平台有很多,我选择了在leetcode进行刷题.回 ...

随机推荐

  1. C#如何连接MySql数据库

    最近两天在解决C#连接MySql数据库的问题,通过不同的从网上学习,最终找到了解决的办法,现在和大家分享一下. 1.要连接MySql数据库必须首先下载MySql官方的连接.net的文件,文件下载地址为 ...

  2. 元器件选型(一)ESD、TVS参考资料

    许多开发人员都遇到过这样的情况:在实验室开发好的产品,测试完全通过,但到了客户手里用了一段时间之后,出现异常现 象,甚至是产品失效需要返修,并且故障率往往也不高(1%以下).一般情况下,以上问题大都由 ...

  3. 图片异步加载 ,KVO

    图片异步下载类目: .h #import <UIKit/UIKit.h> typedef void (^ImageBlock)(UIImage *img); @interface UIIm ...

  4. 补丁惹的祸-ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService

    未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出 问题: 重新安装了VS2012,结 ...

  5. Data Mining 概念

    数据挖掘概念: 数据挖掘是在大型数据库中.自动的发现有用信息的过程. 然. 这个有用只是一个感性的东西.比如我们从表中索引一行数据.这个算不上数据挖掘.因为它依赖的是数据的明显特征. 数据挖掘基本步骤 ...

  6. Matlab 仿真实现TI Instaspin 的Foc 逆Clarke变换和SVPWM

    一直没搞明白TI 的Instaspin的SVPWM实现原理,最后只能在Matlab里仿真看看输出波形是不是和普通的SVPWM实现输出的波形一样,用M文件实现,下面是代码: clear all; the ...

  7. USB mass storage协议

    这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析. 一.背景知识     1.USB Mass Storage类规范概述        USB 组织在univers ...

  8. NFC的安全性

    NFC近距离无线技术具有快捷.易用.安全等特性,其中安全是支付行业最关心的特性. 众所周知传统磁条银行卡的账号信息,是记录在磁条中,当进行刷卡交易时,POS机将交易金额,银行卡中的账号信息以及用户输入 ...

  9. GroundworkCSS ♥ Tables

    微信公众平台开发(41)一键关注微信公众平台账号 - 方倍工作室 - 博客园 微信公众平台开发(41)一键关注微信公众平台账号 GroundworkCSS ♥ Tables Example Layou ...

  10. linux修改系统时间date命令加clock -w

    http://m.jb51.net/LINUXjishu/117784.html 修改linux系统时间的方法(date命令) 11-18 23:22:27作者:脚本之家 命令格式为: date -s ...