LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了。公共部分必须是以相同的顺序出现,但是不必要是连续的。LCS具有最优子结构,且满足重叠子问题的性质。所以我们可以用动态规划来解决LCS问题。由LCS问题的最优子结构可得出递归式:参考代码:#incl...
分类:
其他好文 时间:
2014-08-06 22:19:42
阅读次数:
204
monotonic:单调的.序列为X=(x1,x2,x3,x4...),首先排序X得到X',找出X和X'的最长公共子序列(LCS)即可。另一种思维: 先回顾经典的O(n^2)的动态规划算法,设A[i]表示序列中的第i个数,F[i]表示从1到i这一段中以i结尾的最长上升子序列的长度,初始时设F[i] ...
分类:
其他好文 时间:
2014-08-06 22:19:25
阅读次数:
244
这道题基本上是在普通LCS问题上的一点小小的变形,由求LCS的长度,改为求LCS的权值。架构还是不变的。可作为LCS问题的模板题。时间复杂度O(N^2)。
注意
题目中的字母都是小写字母,也就是只有26种字符。不需要开太大的数组。所以hash就是很好的一种保存权值的方法。另外吐槽一下。子弹序列和恐怖分子序列的长度太坑了,因为题目没有给出长度。我开了个2000个数组,wa了n次。改成2005就AC了。...
分类:
其他好文 时间:
2014-08-06 14:59:11
阅读次数:
162
题意 求两端文本的最长公共子单词序列 直接lcs增量法可以得出 打印路劲也是直接递归就行...
分类:
其他好文 时间:
2014-08-05 22:40:21
阅读次数:
248
1.动态规划和子序列 1.1 动态规划的特征: a)最优子结构,求问题的解必须获取子问题的最优解; b) 重叠子问题,使用原始的递归存在大量的重复计算。 1.2 子序列的概念: a)子序列中的元素都是原字符串中的元素; b)子序列中元素的排列顺序,与他们在原字符串中的顺序...
分类:
其他好文 时间:
2014-08-05 03:00:08
阅读次数:
177
二维动规是如果只用到本层的和上一层的数据就可以用滚动数组
比如 dp[i,j]=max(dp[i-1,j],dp[i,j-1]);
max的意思就不多说了...
具体例子的话,比较经典的就是最长公共子序列,就是 abcde 和 aecd的最长公共子序列就是acd。
如果不是滚动数组的话就是
for i:=1 to length(st1) do
for j:=1 to length(st2)d...
分类:
其他好文 时间:
2014-08-05 00:48:38
阅读次数:
266
今天听了老师讲的最长公共子序列,就拿以前做过的题又做了一遍。。。
我用的是最简单普通的方法,
代码:
#include
#include
#include
using namespace std;
int dp[1005][1005];
int main()
{
char a[1005], b[1005];
int t;
scanf("%d", &t);
while(t --){
...
分类:
其他好文 时间:
2014-08-04 17:59:47
阅读次数:
186
这半个多月一来,主要是在刷DP。开始是一些简单的DP(可是我没有感觉有多简单=_=!!),然后是最大连续子序列,最大公共子序列,最大子矩阵等等,这些题目还好,有的题目甚至可以模板化。还有一些没有解决的难题:1024 Max Sum Plus Plus 最大m段不重叠子段和](可不连续)1244 Ma...
分类:
其他好文 时间:
2014-08-03 23:13:46
阅读次数:
262
简单的DP。f[i][j]表示序列a中前i个中,序列b中前b个中,组成的最长公共子序列的长度。DP方程:if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1; else f[i][j]=max(f[i-1][j],f[i][j-1]);(我这个a下标是从0开始,f是从1开...
分类:
其他好文 时间:
2014-08-01 18:46:32
阅读次数:
209