It's a normal LCS type classical problem:
Source code:
#include<bits/stdc++.h>
using namespace std;
int N1,N2,dp[103][103];
int tower1[103],tower2[103];
int len_LCS(int i,int j)
{
if(i==N1 or j==N2) return 0;
if(dp[i][j]!=-1) return dp[i][j];
int ans=0;
if(tower1[i]==tower2[j])
{
ans=1+len_LCS(i+1,j+1);
}
else
{
int val1=len_LCS(i+1,j);
int val2=len_LCS(i,j+1);
ans=max(val1,val2);
}
return dp[i][j]=ans;
}
int main()
{
int tt=1;
while(scanf("%d %d",&N1,&N2)==2)
{
if( (N1|N2)==0) break;
memset(dp,-1,sizeof(dp));
for(int i=0;i<N1;i++)
{
scanf("%d",&tower1[i]);
}
for(int i=0;i<N2;i++)
{
scanf("%d",&tower2[i]);
}
printf("Twin Towers #%d\nNumber of Tiles : %d\n\n",tt,len_LCS(0,0));
tt++;
}
return 0;
}
Comments
Post a Comment