比赛 20120703 评测结果 AAWWWWWWWW
题目名称 DNA重组 最终得分 20
用户昵称 Czb。 运行时间 1.272 s
代码语言 C++ 内存使用 36.33 MiB
提交时间 2012-07-03 10:18:05
显示代码纯文本
#include<stdio.h>
#include<string.h>
#define MAXN 0x7FFFFFF

int Q,n,m,f[3001][3001];

char s1[5000],s2[5000];

inline int min(int a,int b)
{
	return a<b?a:b;
}

int main()
{
	freopen("dna.in","r",stdin);
	freopen("dna.out","w",stdout);
	int i,j;
	scanf("%d\n",&Q);
	while(Q--)
	{
		memset(f,0,sizeof(f));
		memset(s1,0,sizeof(s1));
		memset(s2,0,sizeof(s2));
		scanf("%s\n%s\n",s1+1,s2+1);
		s1[0]='a';s2[0]='b';
		m=strlen(s1+1);
		n=strlen(s2+1);
		for(i=1;i<=n;i++)
		{
			f[i][0]=MAXN;
			for(j=1;j<=m;j++)
			{
				if(s2[i]==s1[j])
				{
					if(s2[i-1]==s1[j-1])
					{
						if(j==m)
							f[i][j]=min(f[i-1][j-1]-1,f[i][j-1]);
						else
							f[i][j]=min(f[i-1][j-1],f[i][j-1]);
					}
					else
					{
						if(j==1&&j==m)
							f[i][j]=f[i-1][j-1];
						else if(j==1)
							f[i][j]=f[i-1][j-1]+1;
						else if(j==m&&i==1)
							f[i][j]=min(f[i-1][j-1]+1,f[i][j-1]);
						else if(j==m)
							f[i][j]=min(f[i-1][j-1]+2,f[i][j-1]);
						else if(i==1)
							f[i][j]=min(f[i-1][j-1]+2,f[i][j-1]);
						else
							f[i][j]=min(f[i-1][j-1]+3,f[i][j-1]);
					}
				}
				else
				{
					f[i][j]=f[i][j-1];
				}
			}
		}
		if(f[n][m]>=100000000)
			f[n][m]=-1;
		printf("%d\n",f[n][m]);
	}
	return 0;
}