hdu 1159, LCS, dynamic programming, recursive backtrack vs iterative backtrack vs incremental, C++

原创 2015年07月10日 04:14:59

thanks prof. Abhiram Ranade for his vedio on Longest Common Subsequence ‘s back track search view in lecture 19, nice explanation indeed.

// back track, recursive, 390 ms, O(m*n) memory

#include <cstdio>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>

#define MAXSIZE 1001
using std::string;


char *p1, *p2;
int M, N;
int table[MAXSIZE][MAXSIZE];

int solveLCSlength(int i, int j) {
    if(table[i][j]>=0) return table[i][j];
    int k;
    for(k=j;k<N && p2[k]!=p1[i];++k) {}
    if(k!=N) table[i][j]=std::max(solveLCSlength(i+1,j),1+solveLCSlength(i+1,k+1));
    else table[i][j]=solveLCSlength(i+1,j);
    return table[i][j];
}

int LCSlength(string &s1, string &s2) {
    p1=&s1[0], p2=&s2[0], M=s1.size(), N=s2.size();
    for(int i=0;i<M;++i) {
    for(int j=0;j<N;++j) { table[i][j]=-1; }
        table[i][N]=0;
    }
    for(int j=0;j<=N;++j) { table[M][j]=0; }
    return solveLCSlength(0,0);
}

int main() {
    string s1, s2;
    while(std::cin >> s1 >> s2) {
        printf("%d\n",LCSlength(s1,s2));
    }
    return 0;
}

// turn recursive backtrack version to iterative and reduce memory cost to O(m+n) , 312ms

#include <cstdio>
#include <cstring>
#include <algorithm>

#define MAXSIZE 1001

int LCSlength(char *s1, char *s2) {
    static int table[MAXSIZE<<1];
    int len1,len2, i,j,k, *prev,*curr;
    len1=strlen(s1), len2=strlen(s2);
    prev=&table[0], curr=&table[len2+1];
    for(i=0;i<=len2;++i) prev[i]=0;
    curr[len2]=0;
    for(i=len1-1;i>=0;--i) {
            char tmp=s1[i];
        for(j=len2-1;j>=0;--j) {
            for(k=j;k<len2 && tmp!=s2[k];++k) {}
            curr[j]=prev[j];
            if(k!=len2 && curr[j]==prev[k+1]) ++curr[j];
        }
        std::swap(prev,curr);
    }
    return prev[0];
}

int main() {
    char s1[MAXSIZE], s2[MAXSIZE];
    while(scanf("%s%s",s1,s2)==2) {
        printf("%d\n",LCSlength(s1,s2));
    }
    return 0;
}

// incremental, 31ms, O(m+n) memory

#include <cstdio>
#include <algorithm>

#define MAXSIZE 1001

int main() {
    char s1[MAXSIZE], s2[MAXSIZE];
    int table[MAXSIZE<<1], *prev, *curr;
    int len1,len2, i,j;
    while(scanf("%s%s",s1,s2)==2) {
        len1=strlen(s1), len2=strlen(s2);
        prev=table, curr=&table[len2+1];
        for(i=0;i<=len2+1;++i) prev[i]=0;
        for(i=1;i<=len1;++i) {
            for(j=1;j<=len2;++j) {
                if(s1[i-1]==s2[j-1]) curr[j]=1+prev[j-1];
                else curr[j]=prev[j]>curr[j-1]?prev[j]:curr[j-1];
            }
            std::swap(curr,prev);
        }
        printf("%d\n",prev[len2]);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。// p.s. If in any way improment can be achieved, better performance or whatever, it will be well-appreciated to let me know, thanks in advance.

相关文章推荐

VS2008在win7下不时出现Microsoft Incremental Linker已停止工作

这个是因为你的设置有问题。解决方法如下: 项目->属性->链接器->常规 下面的“启用增量链接”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”。 不过这又引入了另外...

VS2008在win7下不时出现Microsoft Incremental Linker已停止工作

这个是因为设置有问题。解决方法如下: 项目->属性->链接器->常规 下面的“启用增量链接”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”。 不过这又引...
  • dodott
  • dodott
  • 2012-09-21 10:32
  • 1277

VS2008在win7下不时出现Microsoft Incremental Linker已停止工作

http://hi.baidu.com/jink20080509/item/235eeec5438f0074ced4f8f0   /INCREMENTAL 选项控制链接器如何处理增量链接。 默认...
  • cay22
  • cay22
  • 2012-10-06 11:42
  • 697

VS2008在win7下不时出现Microsoft Incremental Linker已停止工作

这个是因为设置有问题。解决方法如下: 项目->属性->链接器->常规 下面的“启用增量链接”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”。 不过这又引入了另外...

VS2008在win7下不时出现Microsoft Incremental Linker已停止工作

这个是因为设置有问题。解决方法如下: 项目->属性->链接器->常规 下面的“启用增量链接”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”。 不过这又引...

FULL VS INCREMENTAL OTA

转载:http://www.xanh.co.uk/full-vs-incremental-ota/#more-144 There are two types of OTA. Each with it...

hdu 1159 LCS最大公共子序列

有点那个了…………本来呢保存两行容易写很多,钻牛尖了,不过其实写完之后觉得都很简单,也就这样罢了 就是记录下每一次比较有可能被覆盖的两个点[i-1][j-1] 与 [i-1][j]就可以了 ...
  • HZXPH
  • HZXPH
  • 2011-08-12 16:18
  • 402

最长公共子序列LCS 动态规划 HDU1159

题目链接:点我 首先了解一下什么叫子序列:一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串 子序列和子串还是不一样的,子串是要连续不断的,而子序...

【HDU 1159】Common Subsequence(最长公共序列LCS算法)

Problem DescriptionA subsequence of a given sequence is the given sequence with some elements (possi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)