如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1577

来自"NOCOW"

跳转到: 导航, 搜索

简单DP不解释了,我犯2,手一歪,把mod的数打成了10^9+9。。。结果wa了好久。

#include <cstdio>
#include <cstring>
const int maxn=2002,p=1000000007;
char s1[maxn],s2[maxn];
int n,m,f[maxn][maxn],g[maxn][maxn];
void updata(int i,int j,int x,int y)
{
    if (f[x][y]+1 < f[i][j])
    {
        f[i][j]=f[x][y]+1;
        g[i][j]=g[x][y];
    }
    else if (f[x][y]+1 == f[i][j])
        g[i][j]=(g[i][j]+g[x][y])%p;
}
int main()
{
    int i,j;
    scanf("%s%s",s1+1,s2+1);
    n=strlen(s1+1);
    m=strlen(s2+1);
    memset(g,0,sizeof(g));
    for (i=1;i<=n;++i)
        for (j=1;j<=m;++j)
            f[i][j]=n+m;
    for (i=0;i<=n;++i)  f[i][0]=i;
    for (i=0;i<=m;++i)  f[0][i]=i;
    for (i=0;i<=n;++i)  g[i][0]=1;
    for (i=0;i<=m;++i)  g[0][i]=1;
    for (i=1;i<=n;++i)
        for (j=1;j<=m;++j)
            if (s1[i] == s2[j])  updata(i,j,i-1,j-1);
            else
            {
                updata(i,j,i-1,j);
                updata(i,j,i,j-1);
            }
    printf("%d\n",g[n][m]);
    return 0;
}
//by zzy
个人工具