给定一个序列,找出其中最长的,严格递增的子序列的长度(不要求连续)。

解法一:动态规划

通过一个辅助数组记录每一个元素处的最大序列长度(在必须选这个元素的前提下),然后在坐标小于当前元素的数组扫描,在值小于当前元素的集合中选出最大值即为当前元素处的最大子序列。状态转移方程:

dp[i] = max(1, max(dp[j]+1, j<i, nums[j]<nums[i])

class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
dp = [] # 用于存储每一个元素处的最大序列的长度 n = len(nums)
max_ = 0
for i in range(n):
tmp = 1
for j in range(0,i):
if nums[j]<nums[i]:
tmp = max(tmp,1+dp[j])
dp.append(tmp)
if max_ < tmp:
max_ = tmp
return max_

解法2:贪心算法

class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
n = len(nums)
if n == 0:
return 0
dp = [nums[0]] for i in range(1,n):
if nums[i] > dp[-1]:
dp.append(nums[i])
continue l,r = 0, len(dp)-1
while l < r:
mid = (l+r-1)//2
if dp[mid] < nums[i]:
l = mid + 1
else:
r = mid
dp[l] = nums[i] return len(dp)

2. 最长公共子序列

两个数组中,最长的相等的子序列(不要求连续)。

解法1:动态规划

以两个字符串为例:

str1 = 1a2b3c

str2 = 123abc

1 a 2 b 3 c
1 1 1 1 1 1 1
2 1 1 2 2 2 2
3 1 1 2 2 3 3
a 1 2 2 2 3 3
b 1 2 2 3 3 3
c 1 2 2 3 3 4

从上表可以看出:

  1. 当str1[i] = str2[j]时,此时的最大子序列长度应该等于左上角的值加上1(当i=0时为1,因为此时没有左上角);

  2. 当str1[i] != str2[j]时,此时的最大子序列长度为上方和左方的最大值(当i=0时直接为上方的值)

class LCS:
def findLCS(self, A, n, B, m):
dp1 = [0 for i in range(n)] #
for i in range(m):
dp2 = [0 for each in range(n)]
for j in range(n):
if B[i] == A[j]:
dp2[j] = dp1[j-1]+1 if j>0 else 1
else:
dp2[j] = max(dp2[j-1],dp1[j]) if j>0 else dp1[j]
dp1 = dp2
return dp2[-1]

3. 最长公共子串

最长公共子串:两个字符串中连续相等的最长子串。

解法一:动态规划

class LongestSubstring:
def findLongest(self, A, n, B, m):
dp = [[0 for i in range(n)] for j in range(m)]
max_ = 0
for i in range(m):
for j in range(n):
if B[i] == A[j]:
if i>0 and j >0:
dp[i][j]=dp[i-1][j-1] +1
else:
dp[i][j] = 1
if dp[i][j]>max_:
max_=dp[i][j]
return max_

动态规划1——最长递增子序列、最长公共子序列、最长公共子串(python实现)的更多相关文章

  1. uva103(最长递增序列,dag上的最长路)

    题目的意思是给定k个盒子,每个盒子的维度有n dimension 问最多有多少个盒子能够依次嵌套 但是这个嵌套的规则有点特殊,两个盒子,D = (d1,d2,...dn) ,E = (e1,e2... ...

  2. 最长递增子序列问题—LIS

    问题:给定一组数 a0,a0,....,an-1. 求该序列的最长递增(递减)序列的长度. 最长递增子序列长度的求法有O(n^2)和O(nlogn)两种算法. 1.复杂度为O(n^2)的算法. 设L[ ...

  3. 动态规划 - 最长递增子序列(LIS)

    最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...

  4. 【动态规划】拦截导弹_dilworth定理_最长递增子序列

    问题 K: [动态规划]拦截导弹 时间限制: 1 Sec  内存限制: 256 MB提交: 39  解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...

  5. 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...

  6. 动态规划----最长递增子序列问题(LIS)

    题目: 输出最长递增子序列的长度,如输入 4 2 3 1 5 6,输出 4 (因为 2 3 5 6组成了最长递增子序列). 暴力破解法:这种方法很简单,两层for循环搞定,时间复杂度是O(N2). 动 ...

  7. 算法之动态规划(最长递增子序列——LIS)

    最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...

  8. [C++] 动态规划之矩阵连乘、最长公共子序列、最大子段和、最长单调递增子序列、0-1背包

    一.动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解. 将待求解问题分解成若干个子问题,先求解子 ...

  9. 51Nod - 1134 最长递增子序列【动态规划】

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行:1个数N ...

  10. 求解最长递增子序列(LIS) | 动态规划(DP)+ 二分法

    1.题目描述     给定数组arr,返回arr的最长递增子序列. 2.举例     arr={2,1,5,3,6,4,8,9,7},返回的最长递增子序列为{1,3,4,8,9}. 3.解答      ...

随机推荐

  1. Halcon 学习2 金属雕刻字识别

    *HALCON 里面的例程名称:engraved_cnn.hdevread_image (Image, 'engraved')get_image_size (Image, Width, Height) ...

  2. 最新 吉比特java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.吉比特等10家互联网公司的校招Offer,因为某些自身原因最终选择了吉比特.6.7月主要是做系统复习.项目复盘.LeetCo ...

  3. sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set 的解决办法

    Linux新建用户 ,sudo报错: sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set 解决办法:重置一下s ...

  4. 1、6 登陆 通过name 查到一个对象,如果没有。提示用户名不存在,再将查到的pwd 加传过来的pwd(需要加密)比较

    @RequestMapping("/login") public Object login(Student student) { Student s=studentService. ...

  5. Vue.js与React的全面对比

    Vue与React的对比 Vue.js与React.js从某些反面来说很相似,通过两个框架的学习,有时候对一些用法会有一点思考,为加深学习的思索,特翻阅了两个文档,从以下各方面进行了对比,加深了对这两 ...

  6. java Files 和 Path对文件操作

    1.拷贝文件 /** * 拷贝文件,生成新的文件名 * @param pathUpload * @return */ private String converUploadFileName(Strin ...

  7. Redis 常用命令学习二:字符串类型命令

    1.赋值与取值命令 127.0.0.1:6379> set foo helloredis OK 127.0.0.1:6379> get foo "helloredis" ...

  8. SSH简介及两种远程登录的方法

    出处 https://blog.csdn.net/li528405176/article/details/82810342 目录 SSH的安全机制 SSH的安装 启动服务器的SSH服务 SSH两种级别 ...

  9. Postman和jmeter的区别

    1.创建接口用例集(没区别) Postman是Collections,Jmeter是线程组,没什么区别. 2.步骤的实现(有区别) Postman和jmeter都是创建http请求 区别1:postm ...

  10. spring 框架的核心总结

    最近在学习Java语言,从而也学习了SpringFramework 这个大名鼎鼎的框架.从而做一些的记录. 题外话: 学习过几种不同的语言,后来知道所有的编程语言里所有的概念翻来覆去都是一样的事物,只 ...