题库
a) 最长不下降子序列
以一元组(i)作为状态,表示第i个作为序列的最后一个点的时候的最长序列。于是很容易想到O(n2)得算法。但本题可合理组织状态,引入一个单调的辅助数组,利用单调性二分查找,优化到O(nlogn)。关于优化详见优化章。
一些问题可将数据有序化,转化成本题。
应用:
拦截导弹(NOIP99 Advance 1) 就是原题。
Beautiful People (sgu199),要将数据有序化:其中一个权作为第一关键字不下降排列,另一个权作为第二关键字不上升。
Segment (ural 1078),将线段的左端点有序化就可以了。
b) LCS
状态(i,j),表示第1个字符串的第i位,与第2个字符串的第j位匹配,得到的最长的串。若有多个串要LCS,则加维,即几个串就几个维。我也将此题归入路径问题。
c) 花店橱窗布置(IOI99)
见路径问题。
a) 最长不下降子序列
以一元组(i)作为状态,表示第i个作为序列的最后一个点的时候的最长序列。于是很容易想到O(n2)得算法。但本题可合理组织状态,引入一个单调的辅助数组,利用单调性二分查找,优化到O(nlogn)。关于优化详见优化章。
一些问题可将数据有序化,转化成本题。
应用:
拦截导弹(NOIP99 Advance 1) 就是原题。
Beautiful People (sgu199),要将数据有序化:其中一个权作为第一关键字不下降排列,另一个权作为第二关键字不上升。
Segment (ural 1078),将线段的左端点有序化就可以了。
b) LCS
状态(i,j),表示第1个字符串的第i位,与第2个字符串的第j位匹配,得到的最长的串。若有多个串要LCS,则加维,即几个串就几个维。我也将此题归入路径问题。
c) 花店橱窗布置(IOI99)
见路径问题。
准备开始拾起DP的东西,于是从基础开始做起。
最长不降的子序列的o(nlogn)就是增加一个数组,记录长为i的所有序列中最大或者是最小的值,通过二分进行查找,很容易证明该数组是不间断的,递增的数组。
做的题是POJ1631
然后是LCS。。。需要说明一下这道题。POJ2192;开始的时候将它当成简单的LCS,将两个字串与主串匹配,后来出现了问题,其实这道题用简单的搜索就能过,但是既然是在做DP ,就用DP的方式。这个思路很有意思。这是看了别人的想法来领悟的。
这个的主要框架是当a[i]=a[j]的时候dp[i][j]=dp[i-1][j-1];如果不等,则dp[i][j]=max(dp[i][j-1],dp[i-1][j])
最后是路径问题,就是普通的路径就好了。是POJ1157.由于没有要求输出路径于是我就将这一步省略了。