动态规划面试题基础合集1--数学三角形,LIS , LCS, CSD
动态规划的一般思路是分为四步,即:寻找最优子结构、递归定义最优子结构、自底向上求解最优子结构和构造最优解。
接下来我列举出几个常见的动态规划面试题进行说明。
(1)数学三角形:比较简单,直接贴一个我看到的讲得最清楚的文章,http://blog.csdn.net/baidu_28312631/article/details/47418773
(2)LIS:最长上升子序列问题。
思路1:
其实就是寻找f(n)和f(n-1)之间的关系,对于一个序列,f(n)要么等于f(n-1),要么等于f(n-1)+1, 但是什么情况下相等,这是需要思考清楚的,也是解决这个问题的关键。
通过自己写一写test case,可以发现这种递推式无法很方便地写出来,因为第n个数和第n-1个数的关系无法推导f(n), 但是我们换个思路转换原问题的话,马上可以得到这样一个递推式:

这里对问题进行了转换,变成了:序列加入一个数后,包含这个数的最长上升子序列。举个例子,如果加入的数小于序列其他值,那么显然有L(k) = 1。 这是一个递推式,我们很容易能自底向上求得L(k).
这个问题和原问题并不等价,但是我们可以发现既然是最长递增子序列,那么只要找到这个问题中L(k)的最大值即可。原问题的f(k) = max(L(k)) , 这个才是原问题的解。
思路2:(奇妙的解法,复杂度O(n*logn), 看了几篇文章发现要么不解释,要么解释很复杂,我这里简洁描述一下,应该挺好懂)
由于一个序列的上升子序列有很多,那么我们如何判断新加入一个数后,最长子序列是否增长了呢?我们可以记录相同长度的子序列中所有最大值的最小值,只要加入一个数,就遍历不同长度子序列的最小值,判断新加入的数是否大于这个最小值就能得到最长子序列。
所以,创建一个长度为n的数组来存这些不同长度的最小值,每加入一个数就进行二分搜索并更新这个数组,代码如下:
int LIS(int* a, int n)
{
int dp[n];
const int inf = 0x7FFFFFFF;
fill(dp, dp + n, inf);
for(int i = ; i < n; i++) {
*upper_bound(dp,dp + n, a[i]) = a[i];//二分搜索,返回一个非递减序列[first, last)中的第一个大于值val的位置
}
return (lower_bound(dp, dp + n, inf)-dp);//二分搜索,返回一个非递减序列[first, last)中的第一个大于等于值val的位置
}
(3)LCS:最长公共子序列问题,比如求两个字符串的最长公共字符串长度。
比如字符串1:BDCABA;字符串2:ABCBDAB
则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA
思路:可以推导出如下递归公式:

//递归解法
int LCS(const char* s1, const char* s2, int i, int j)
{
if(i< || j<)
return ;
if(s1[i] == s2[j])
{
return LCS(s1, s2, i-, j-)+;
}
else
{
return max(LCS(s1, s2, i, j-),LCS(s1, s2, i-, j));
}
}
//循环解法
int LCS2(string s1, string s2)
{
int len1 = s1.length();
int len2 = s2.length();
int dp[len1+][len2+];
for(int i=;i<=len1;++i)
fill(dp[i], dp[i]+len2+, );
for(int i=;i<=len1;++i)
{
for(int j=;j<=len2;++j)
{
if(s1[i-]==s2[j-])
dp[i][j] = dp[i-][j-]+;
else
dp[i][j] = max(dp[i-][j],dp[i][j-]);
}
}
return dp[len1][len2];
}
(4)CSD(编辑距离):
字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中,字符操作包括:
- 删除一个字符
- 插入一个字符
- 修改一个字符
例如对于字符串"if"和"iff",可以通过插入一个'f'或者删除一个'f'来达到目的。
思路:递推公式如下


i>0,j>0的公式分别是删除一个字符,插入一个字符,修改一个字符后的操作次数。其它的边界条件就容易理解了。递归代码如下,循环版本的也很好写。
int min3(int a, int b, int c)
{
return min(min(a,b),c);
} int CSD(const char* s1, const char* s2, int i, int j)
{
if(i< && j<)
return ;
else if(i<)
return j+;
else if(j<)
return i+;
return min3(CSD(s1,s2,i-,j)+, CSD(s1,s2,i,j-)+, CSD(s1,s2,i-,j-)+(s1[i]==s2[j]?:));
}
动态规划面试题基础合集1--数学三角形,LIS , LCS, CSD的更多相关文章
- es6常用基础合集
es6常用基础合集 在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得 ...
- Java面试题资料合集
Java面试题资料合集 2021年最新版--Java+最常见的+200++面试题汇总+答案总结汇总.pdf BIO,NIO,AIO,Netty面试题 35道.pdf Dubbo面试题 47道.pdf ...
- 前端基础进阶(十四):es6常用基础合集
在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得高兴的是,如果你熟悉 ...
- MySQL基础合集
我的小站 1.MySQL的优势 运行速度快 使用成本低 可移植性强 适用用户广 2.MySQL的运行机制 一个SQL语句,如select * from tablename ,从支持接口进来后,进入连 ...
- Linux 命令基础合集
下面总结的是在使用 Linux 最常用的命令: 常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及 ...
- 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!
前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...
- [题解+总结]NOIP动态规划大合集
1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...
- NOIP动态规划大合集
1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...
- Struts+Hibernate+Spring面试题合集及答案
Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 2 ...
随机推荐
- JAVA 加密算法初探DES&AES
开发项目中需要将重要数据缓存在本地以便在离线是读取,如果不对数据进行处理,很容易造成损失.所以,我们一般对此类数据进行加密处理.这里,主要介绍两种简单的加密算法:DES&AES. 先简单介绍一 ...
- MySQL修改端口号操作
在C盘下的program Files下找到MySQL文件夹 - my.ini配置文件有个port=3306 修改即可
- CSS边框及常用样式
一.CSS设置样式 1.1 边框border 作用:设置标签周围的边框,方法 board:宽度 样式 颜色,一般情况下样式使用 solid实体的,和dotted虚线的 <head> &l ...
- .Net Framework4.0 ashx页面报错:检测到有潜在危险的Request.Form值
前些日子做项目的时候遇到一个问题,在ASP.NET 中使用JQuery的AJAX调用一般处理程序ashx出错,在处理程序中错误提示如下:从客户端(Text="<img alt=&quo ...
- swiper隐藏再显示出现点击不了情况
//初始化swiper var swiper = new Swiper('.swiper-container', { pagination: '.swiper-pagination', nextBut ...
- 【转】java格式化输出 printf 例子
[转]java格式化输出 printf 例子 转自http://www.cnblogs.com/TankMa/archive/2011/08/20/2146913.html#undefined imp ...
- Vue 表格内容根据后台返回状态位填充文字
本文地址:http://www.cnblogs.com/veinyin/p/8534365.html Vue 做表格时我们常用的就是 v-for ,直接把 prop 绑定上去,但是如果表格内容需要我 ...
- Python练习-有点儿意思的用户登录
Alex大神的需求(说实话他需求真特么多,真难满足他): 编写一个用户登陆接口:输入用户名密码,认证成功后显示欢迎信息,输错三次后锁定; # 编辑者:闫龙 #用户登录功能输入3次以上会被锁定:为了方便 ...
- 创造101:如果软件测试工程师组团出道,怎样才能站C位?!
作者 C位出道的华华 虽然华华是一个软件测试技术宅,可以连续七七四十九天加班不重样,心里除了上班工作学习写代码就没有别的爱好了,但是各种潮流资讯啊狗血剧啊娱乐综艺啊,从来没有错过. 比如说现在大火的& ...
- 【译】第十二篇 SQL Server代理多服务器管理
本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...