LCS 求最长公共子序列 dp

来源:互联网 发布:淘宝模版如何制作 编辑:程序博客网 时间:2024/06/07 01:34

【1】求最长公共子序列 要求可以不连续 不输出,只求长度;

#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<vector>using namespace std;#define N 100000int s[10000][1000];char a[100],b[100];int LCS(){    int i,j;    for(i=0; i<=strlen(a); i++)    {        s[i][0]=0;      //  puts("****");    }    for(j=0; j<=strlen(b); j++)    {        s[0][j]=0;    }    for(i=1; i<=strlen(a); i++)    {        for(j=1; j<=strlen(b); j++)        {            if(a[i-1]==b[j-1])            {                s[i][j]=s[i-1][j-1]+1;            }            else            {                if(s[i-1][j]>=s[i][j-1])                {                    s[i][j]=s[i-1][j];                }                else if(s[i-1][j]<s[i][j-1])                {                    s[i][j]=s[i][j-1];                }            }        //    printf("%d %d %d\n",s[i][j],i,j);        }    }    return s[strlen(a)][strlen(b)];//}int main(){    scanf("%s",a);    scanf("%s",b);    int len=LCS();    cout<<len<<endl;}

【2】输出长度
用一个二维数组进行标记:

#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<vector>using namespace std;#define N 100000int s[10000][1000];char a[100],b[100];int vis[10000][1000];int LCS(){    int i,j;    for(i=0; i<=strlen(a); i++)    {        s[i][0]=0;      //  puts("****");    }    for(j=0; j<=strlen(b); j++)    {        s[0][j]=0;    }    for(i=1; i<=strlen(a); i++)    {        for(j=1; j<=strlen(b); j++)        {            if(a[i-1]==b[j-1])            {                s[i][j]=s[i-1][j-1]+1;                vis[i][j]=1;            }            else            {                if(s[i-1][j]>=s[i][j-1])                {                    s[i][j]=s[i-1][j];                    vis[i][j]=2;                }                else if(s[i-1][j]<s[i][j-1])                {                    s[i][j]=s[i][j-1];                    vis[i][j]=3;                }            }        }    }    return s[strlen(a)][strlen(b)];//}void printstring(int i,int j){    if(i==0||j==0)    {        return ;    }    else    {        if(vis[i][j]==1)        {            printstring(i-1,j-1);            printf("%c ",a[i-1]);        }        else  if(vis[i][j]==2)        {           printstring(i-1,j);        }        else        {            printstring(i,j-1);        }    }}int main(){    scanf("%s",a);    scanf("%s",b);    int len=LCS();    cout<<len<<endl;    printstring(strlen(a),strlen(b));}

【3】求最长子串

要求必须连续,不输出串,只输出长度;

#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<vector>using namespace std;#define N 100000int s[10000][1000];char a[100],b[100];int vis[10000][1000];int LCS(){    int i,j;    int len=0;    for(i=0; i<=strlen(a); i++)    {        s[i][0]=0;    }    for(j=0; j<=strlen(b); j++)    {        s[0][j]=0;    }    for(i=1; i<=strlen(a); i++)    {        for(j=1; j<=strlen(b); j++)        {            if(a[i-1]==b[j-1])            {                s[i][j]=s[i-1][j-1]+1;                if(len<s[i][j])                {                    len=s[i][j];                }            }            else            {                s[i][j]=0;            }        }    }    return len;}int main(){    scanf("%s",a);    scanf("%s",b);    int len=LCS();    cout<<len<<endl;}

【4】求最长子串,输出

#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<vector>using namespace std;#define N 100000int s[10000][1000];char a[100],b[100];int vis[10000][1000];int LCS(){    int i,j;    int len=0;    for(i=0; i<=strlen(a); i++)    {        s[i][0]=0;    }    for(j=0; j<=strlen(b); j++)    {        s[0][j]=0;    }    for(i=1; i<=strlen(a); i++)    {        for(j=1; j<=strlen(b); j++)        {            if(a[i-1]==b[j-1])            {                s[i][j]=s[i-1][j-1]+1;                if(len<s[i][j])                {                    len=s[i][j];                }                vis[i][j]=1;            }            else            {                s[i][j]=0;            }        }    }    return len;}void printstring(int i,int j){    if(i==0||j==0)    {        return ;    }    else    {        if(vis[i][j]==1)        {            printstring(i-1,j-1);            printf("%c ",a[i-1]);        }        else        {             printstring(i-1,j-1);        }    }}int main(){    scanf("%s",a);    scanf("%s",b);    int len=LCS();    cout<<len<<endl;    printstring(strlen(a),strlen(b));}
原创粉丝点击