记录编号 36606 评测结果 AAAAAAAAAA
题目名称 交错匹配 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.015 s
提交时间 2012-03-15 13:59:27 内存使用 0.61 MiB
显示代码纯文本
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m;
int a[300],b[300];
int f[300][300];

void init()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int i=1;i<=m;i++)
		scanf("%d",&b[i]);
	memset(f,0,sizeof(f));
}

void solve()
{
	int i,j,k,x,y;
	bool havea,haveb;
	for (i=1;i<=n;i++)
	{
		for (j=1;j<=m;j++)
		{
			f[i][j]=f[i-1][j];
			if (f[i][j]<f[i][j-1]) 
				f[i][j]=f[i][j-1];
			if (a[i]!=b[j])
			{
				havea=haveb=0;
				for (k=j-1;k>=1;k--)
				{
					if (b[k]==a[i])
					{
						y=k;
						havea=1;
						break;
					}
				}
				for (k=i-1;k>=1;k--)
				{
					if (a[k]==b[j])
					{
						x=k;
						haveb=1;
						break;
					}
				}
				if ((havea)&&(haveb)&&(f[i][j]<f[x-1][y-1]+1))
				f[i][j]=f[x-1][y-1]+1;
			}
		}
	}
	printf("%d\n",f[n][m]*2);
}

int main()
{
    freopen("crossa.in","r",stdin);
    freopen("crossa.out","w",stdout);
	init();
    solve();
    return 0;
}