摘要:
这一题算是一道典型的裸睡(又裸又水)题了吧,不过用刚学的滚动数组进行了优化,时间跟空间复杂度大幅度下降,如果字符长度超过5000的话恐怕不进行优化是要MLE的,不多说了,看代码吧。。。状态f[i][j]表示检查到Ai跟Bj时的最长公共子序列的长度,如果Ai = Bj,那么f[i][j] = f[i - 1][j - 1] + 1,否则考虑三种情况:(1)Ai在公共子序列中,Bj不在, f[i][j - 1];(2)Bi在公共子序列中,Ai不在, f[i - 1][j];(3)Ai跟Bi都不在,f[i - 1][j - 1]。由于第三种情况一定小于前两种情况,故f[i][j] = max{f.. 阅读全文
posted @ 2012-03-06 16:54
背着超人飞
阅读(179)
评论(0)
推荐(0)
摘要:
这一题的思路就是先求出原序列与原序列的逆序列的最大公共子序列的长度,然后用原序列的长度减去即可。至于为什么这样做还请高手指点。。。因为题目中的数据量比较大,开5000*5000的数组会MLT,所以考虑用滚动数组来做。。。状态f[i][j]表示检测的Ai与Bj时的最大公共子序列的长度,状态转移方程为:f[i][j] = max{f[i - 1][j], f[i][j - 1]} + 1。。。AC code:View Code 1 #include <iostream> 2 #define MAX 5001 3 using namespace std; 4 int maxlen[2][ 阅读全文
posted @ 2012-03-06 16:14
背着超人飞
阅读(140)
评论(0)
推荐(0)