タイトル説明
自然数、UP [1 ... N]、2行ある DOWN [1 ... M]は、 UP [I] = DOWN [J場合 ] = K、 次いで、アップリンクI番目の位置の数ができ、ダウンリンクJ番目とKマッチとして知られている行の偶数、だけ位置の数と接続ラインまで。また、各Kとは一致交差LとK≠Lと一致しなければなりません!今試合の最大数を必要とします。
たとえば、次のマッチの最大数は2行より少ない数8
エントリー
文書CROSS。読み出しデータは、最初の行から2つの正の整数N及びMであります UPの自然数N、MのDOWN第三列の自然数の2行目。ここで、0 <N、M <= 200、UP、多くて32,767以下の数DOWN。
輸出
CROSS.OUTに出力を一致の最大数。
コード
#include<cstdio>
#include<algorithm>
using namespace std;
int a[205]={0},b[205]={0},f[205][205]={0},n,m,la,lb;
void get(int i,int j)
{
int x=a[i],y=b[j];
la=i-1;
lb=j-1;
while(a[la]!=y && la>0)la--;
while(b[lb]!=x && lb>0)lb--;
}
int main()
{
freopen("cross.in","r",stdin);
freopen("cross.out","w",stdout);
int i,j,k,t;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(i=1;i<=m;i++) scanf("%d",&b[i]);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
f[i][j]=max(f[i-1][j],f[i][j-1]);
get(i,j);
if(la!=0 && lb!=0 && a[la]!=b[lb]) if(f[la-1][lb-1]+2>f[i][j]) f[i][j]=f[la-1][lb-1]+2;
}
printf("%d",f[n][m]);
return 0;
}