Pagini recente » Cod sursa (job #1995542) | Cod sursa (job #1164813) | Cod sursa (job #1234787)
#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;
}