1577. E-mail

http://acm.timus.ru/problem.aspx?space=1&num=1577

递推 DP

代码及其注释:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <queue>

#include <vector>

#include <algorithm>



#define LL long long

//#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const int MOD=1000000007;

const int N=2005;

int mm[N][N];//到 i ,j 时最少需要多少个字符

int ans[N][N];//到 i ,j 时有多少种类

char a[N],b[N];

int main()

{

    //freopen("data.txt","r",stdin);

    gets(a);

    gets(b);

    int n=strlen(a);

    for(int i=n;i>0;--i)

    a[i]=a[i-1];

    int m=strlen(b);

    for(int i=m;i>0;--i)

    b[i]=b[i-1];//将字符向后移一位

    for(int i=1;i<=n;++i)

    {mm[i][0]=i;ans[i][0]=1;}//初始化

    for(int j=1;j<=m;++j)

    {mm[0][j]=j;ans[0][j]=1;}//初始化

    mm[0][0]=0;ans[0][0]=1;//初始化

    for(int i=1;i<=n;++i)

    {

        for(int j=1;j<=m;++j)

        {

            if(a[i]==b[j])//当相等时 直接匹配

            {mm[i][j]=1+mm[i-1][j-1];ans[i][j]=ans[i-1][j-1];}//更新

            else if(mm[i-1][j]<mm[i][j-1])

            {mm[i][j]=1+mm[i-1][j];ans[i][j]=ans[i-1][j];}

            else if(mm[i-1][j]>mm[i][j-1])

            {mm[i][j]=1+mm[i][j-1];ans[i][j]=ans[i][j-1];}

            else//注意  mm[i-1][j]==mm[i][j-1] 的这种情况

            {mm[i][j]=1+mm[i-1][j];ans[i][j]=(ans[i-1][j]+ans[i][j-1])%MOD;}

        }

    }

    cout<<ans[n][m]<<endl;



    return 0;

}



 

你可能感兴趣的:(mail)