Cod sursa(job #1234787)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 27 septembrie 2014 23:36:03
Problema Subsir Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("subsir.in");
ofstream g("subsir.out");
int N,M;
int DP[505][505],NB[505][505];
char A[505],B[505];
void Read()
{
    f>>(A+1)>>(B+1);
    M=strlen(A+1);
    N=strlen(B+1);
}

void CMLSC()
{
    int i,j;
    for(i=1;i<=M;i++)
        for(j=1;j<=N;j++)
        {
            if(A[i]==B[j])
                DP[i][j]=DP[i-1][j-1]+1;
            else
                DP[i][j]=max(DP[i][j-1],DP[i-1][j]);
        }
}

int countNB(int i,int j,int val)
{
    if(NB[i][j]!=0)
        return NB[i][j];
    if(DP[i][j]==0)
        return 0;
    if(A[i]==B[j])
    {
        if(DP[i][j]==1)
            NB[i][j]=1;
        else
            NB[i][j]=countNB(i-1,j-1,val-1);
        return NB[i][j];
    }

    if(DP[i-1][j]<DP[i][j-1] && DP[i][j-1]==val)
        NB[i][j]= countNB(i,j-1,val);
    if(DP[i-1][j]==DP[i][j-1] && DP[i][j-1]==val)
        NB[i][j]=countNB(i,j-1,val)+countNB(i-1,j,val)-countNB(i-1,j-1,val);
    if(DP[i-1][j]>DP[i][j-1] && DP[i-1][j]==val)
        NB[i][j]=countNB(i-1,j,val);
    return NB[i][j];
}
int main()
{
    Read();
    CMLSC();
    g<<countNB(M,N,DP[M][N])<<"\n";
    return 0;
}