c 最大子序列和_算法总结:左神class8—跳台阶+最长递增公共子序列
【跳台阶】有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法?
public int s1(int n){ if (n< 1){ return 0; if(n == 1 || n== 2){ return n; return s1(n - 1) +s1(n - 2);}
【最长递增子序列长度】给定数组arr,返回arr的最长递增子序列长度。比如arr=[2,1,5,3,6,4,8,9,7],最长递增子序列为[1,3,4,8,9],所以返回这个子序列的长度5。给定数组arr,返回arr的最长递增子序列长度。比如arr=[2,1,5,3,6,4,8,9,7],最长递增子序列为[1,3,4,8,9],所以返回这个子序列的长度5。
【解】先生成长度为5的数组dp,dp[i]表示在必须以arr[i]这个数结尾的情况下,arr[0..i]中的最大递增子序列长度。
arr[0]时,第一个最大递增子序列只有自己dp[0]=1;
接下来从左到右依次算出每个位置的数结尾的情况下最长递增子序列的长度。假设计算到位置i,求以i结尾的最长递增子序列长度,也就是dp[i]的值;如果最长递增子序列长度必须以arr[i]结尾,那么在arr[0……i-1]中所有比arr[i]小的数均可作为倒数第二个数,在这些数中,以哪个结尾的最长递增子序列长度最大选哪个作为倒数的第二个数;,故状态方程为arr[0……i-1]中所有数都不比arr[i]小,另dp[i]=1即可;说明必须以arr[i]结尾的最大递增子序列只包含arr[i]。
【最长公共子序列】给定两个字符串str1和str2,返回两个字符串的最长公共子序列。例如,str1="1A2C3D4B56"str2="B1D23CA45B6A”,”123456"或者"12C4B6"都是最长公共子序列,返回哪一个都行。
假设str1的长度为M, str2的长度为N,生成大小为M*N的矩阵dp.dp[i][j]的含义是str1[0..i]与str2[0..j]的最长公共子序列的长度。
dp求法如下:
1、矩阵dp第一列,即dp[i][0],代表str1[0..i]与str2[0]的最长公共子序列长度。str2[0]只有一个字符,所以dp[i][o]最大为1。
如果str1[i]==str2[0],则令dp[i][0]为1一旦dp[i][0]被设为1,则令dp[i+i..M][0]全部为1
2、矩阵dp第一行,即dp[0][j],与步骤1同理。如果stri[0]==str2[j],则令dp[0][j]为1,一且dp[0][j]被设为1,则令dp[0][j+1..N]全部为1
3、其他位置,dp[i][jl的值只可能来自以下三种情况∶
情况1∶可能是dp[i-1][j]的值。这代表str1[0..i-1]与str2[0..j]的最长公共子序列长度。
举例:str1="A1BC2",str2="AB34C".
str1[0..3]为”A1BC",str2[0..4]为”AB34C”,这两部分最长公共子序列为“ABC”,即dp[3][4]为3。str1整体和str2整体最长公共子序列也是"ABC”,所以dp[4][4]可能来自dp[3][4]。
情况2∶同理可知,dp[i][]的值也可能是dp[i][j-1]。
情况3:如果str1[i]==str2[j],还可能是dp[i-1][j-1]+1的值。
举例:比如str1="ABCD" ,str2="ABCD" .str1[0..2]即”ABC"与str2[0..2]即"ABC"的最长公共子序列为"ABC”,也就是dp[2][2]为3。因为str1和str2的最后一个字符都是”D”,所以dp[i][j]=dp[i-1][j-1]+1。
三种可能的值中,选最大值作为dp[i][j]的值。
c 最大子序列和_算法总结:左神class8—跳台阶+最长递增公共子序列相关推荐
- 【动态规划】计蒜客:蒜头君的日志(最长递增公共子序列)
dp[i][j]:同时以nums[i]结尾和nums[j]结尾的最长递增公共子序列 初始化: dp[0][j]=0 dp[j][0]=0 状态转移方程: nums[i]!=nums[j] dp[i][ ...
- 最长公共子序列、最长连续公共子序列、最长递增子序列
面试中除了排序问题,还会经常出现字符串的子序列问题,这里讲解使用动态规划解决三个常见的子序列问题: 1.最长公共子序列问题(LCS,longest-common-subsequence problem ...
- 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列
(为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...
- hdoj1423 最长上升公共子序列
hdoj1423 题目分析: 两个数组a[n1] , b[n2], 求最长上升公共子序列. 我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对 ...
- 最长递增子序列 子串_最长递增奇偶子序列
最长递增子序列 子串 Problem statement: 问题陈述: Given a sequence of numbers you have to find out the length of t ...
- cstring查找子字符串_动态规划6:两个字符串的最长连续公共子串
本文和前一篇:动态规划5-两个字符串的最长公共子序列类似,但公共子串必须是连续的,子序列不需要连续 字符串a,长度为m:a[1].a[2].a[3].a[4]....a[m] 字符串b,长度为n:b[ ...
- 每天一道LeetCode-----计算两个序列最长的公共子序列长度
原题链接Maximum Length of Repeated Subarray 计算两个序列最长的相同子序列的长度 简单暴力的方法是对A中每个元素遍历一遍序列B,找到相同的位置后计算从这个位置开始有多 ...
- 数组的最长递减子序列java_最长递增/递减子序列
<编程之美>里有个题目是要求数组中最长递增子序列,在CSDN上看到的题目是数组中的最长递减子序列.题目如下: 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子 ...
- 最大子序列求和_算法——求最大子段和
一.问题描述 给定由n个整数组成的序列(a_1,a_2,-,a_n),最大子段和问题要求该序列形如 的最大值(1≤i≤j≤n),当序列中所有整数均为负整数时,其最大子段和为0. 例如,序列(-20, ...
最新文章
- 什么是A记录、MX记录、CNAME记录
- linux php进程端口占用,linux如何查看端口占用情况
- 东北农业大学农学院程晓非教授荣获植物病毒学国家“优青”资助
- phpstudy免费安全检测服务_Phpstudy联合各大安全厂商为用户提供免费安全检测服务...
- workaround: 从product category移除settype时绕过check
- 漫画:如何用Zookeeper实现分布式锁?
- 不聊webpack配置,来说说它的原理
- 这道 Go 题目外网超过 80% 的人都答错了,你来试试...
- int 转CString
- 微信开发值得推荐的开源项目
- java线程中yield(),sleep(),wait()区别详解
- android view分析工具栏,如何在Android工具栏中使用SearchView
- 数学基础修炼手册-数学分析-凸优化
- [博应用官网]iTunes备份密码忘记了该如何解决?
- 几种搜索引擎算法 SEO
- SEO内链优化,网站内部链接优化方法
- 微信摇一摇周边新功能上线
- 计算机毕业设计 SSM房屋租赁系统 房屋租赁合同管理系统 智慧房屋租赁平台Java Vue MySQL数据库 远程调试 代码讲解
- 单个应用流量统计实现和核对
- 书山有路勤为径--书虫成长之路
热门文章
- 8.1 文件查找local;find使用
- 特斯拉自动驾驶系统秘密,来自特斯拉AI总监爆料
- Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析
- [LeetCode]题解(python):058-Length of Last Word
- 使用的 SQL Server 版本不支持数据类型“datetime2”的错误解决方法
- linux下源码软件包的安装
- 读取exchange邮件的未读数(转载)
- VC++学习(15):多线程
- Linux根文件系统结构再认识
- 【图像处理面试题】——1