Java教程

9.4 更多经典模型

本文主要是介绍9.4 更多经典模型,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

yes,dp差不多只剩下最后一章的扫尾工作了,加油!
本节将介绍一些常见结构中的动态规划,序列,表达式,凸多边形和树。尽管他们的形式和解法千差万别,但都用到了动态规划的思想:从复杂的题目背景中抽象出状态表示,然后设计他们之间的转移。

9.4.1 线性结构上的动态规划

最长上升子序列问题(LIS)

设d(i)为以i结尾的最长上升子序列的长度,则d(i) = max{0, d(j)|j<i, Aj<Ai}+1,最终答案是max{d(i)},如果LIS中的相邻元素可以相等,把小于号改成小于等于号即可。上述算法的时间复杂度为O(n*n)

最长上升子序列问题复杂度为O(nlogn)的揭发思路大致是这样的
1.d[i]此时表示的不再是第i个数的最长上升子序列的值,而是表示长度为i的上升子序列的最后一个数的最小值(贪心的思想,在相同长度的情况下,肯定是长度越小其更优秀,因为这样更可能为后面的数字拼接搭建桥梁,也就是说如果现在有两个子序列1,2,3和2,3,4很明显d[3] = 3而不是4,因为无论后面的数字怎么样,肯定是相同长度下的最后一个数字越小越好

最长公共子序列问题(LCS)
最长公共子序列在一些特殊情况下可以转换为最长上升子序列问题
笔者是这样考虑的,首先我们不妨假设上下两个数组一个是num1,一个是num2
那么我们就可以为构建一个关系,让num1[i]映射到i上,然后此时num2上的数字只有出现num1上的数字那么就会有独一无二的i与其对应(如果有重复的情况,依次分配值,无法非陪就给予INF
其他不在num1之间的情况,那么我们的赋值也是INF
这样我们就可以将原先的num2上的数字转换成对应的num1上的下标,此时最长公共子序列问题就转换成了最长上升子序列问题,很明显,其时间复杂度为O(nlogn)

作者是这样给出的解答:
设d(i,j)为A1,A2,...,Ai和B1,B2和Bj的LCS的长度,则当A[i]=A[j]的时候,d(i,j) = d(i-1,j-1)+1,否则d(i,j) = max{d(i-1,j), d(i,j-1)}
时间复杂度为O(nm),其中n和m分别是序列A和B的长度

Lighting_System_Design

这篇关于9.4 更多经典模型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!