1017 防盗门系统

 

防盗门系统

时间限制: 1000 ms | 内存限制: 65536 KB
描述

为了加强管理,北航ACM训练队准备在实验室安装“条形码防盗门系统”,防盗门识别到队员们证件上的条形码就能打开。但是防盗门上的识别器模糊,Oyster曾经拿着一本《算法导论》的条形码溜进去了。纸是包不住火的,这天刚好让队长LEO发现了,立刻下令:我们要对所有的条形码进行测试!

 

条形码由许多粗细不同的黑白平行直线段夹并而成,现在我们要把它看成是许多粗细相同的直线段夹并成的(即,一根粗线看成几根单位粗的细线夹成)。

 

影响防盗门的识别器工作的主要原因是条形码之间的相似度太高。从两个条形码各取若干部分(起始位置不必相同),分别夹并成两个新的“子条形码”,如果这两子条形码完全一致,那么它们是相似的,相似度就是两个条形码的最长的相似子条形码的长度。

输入

输入包括多组数据,第一行为一个整数T,表示数据的组数。

以下对应每个数据都有两行,分别为两个条形码的描述,其中0表示单位长度的白线,1表示单位长度的黑线,以换行符为行结束标志(长度不超过3200)。(如上图为101110)

输出

对应每一组数据,只需要输出一行,它们的相似度L。

样例输入
2
10100
00
111000
1010
样例输出
2
3
提示

1、条形码按输入给出的方向计算,不需要倒置或翻转。
2、样例的最长子条形码分别为00和110。

动态规划题目

#include <stdio.h>
#include <string.h>
main()
{
	int t,i,al,bl,j;
	char aa[3201],bb[3201];
	char a[3201],b[3201];
	int f[2][3201];
	scanf("%d",&t);
	getchar();
	while(t--)
	{	
		scanf("%s",&aa);
		scanf("%s",&bb);
	
		al=strlen(aa);
		bl=strlen(bb);

		for(i=al-1;i>=0;i--)
			a[i+1]=aa[i];

		for(i=bl-1;i>=0;i--)
			b[i+1]=bb[i];
		
		for(i=0;i<3201;i++)
			f[0][i]=0;
		f[1][0]=0;
		
		
		for(i=1;i<=bl;i++)
			for(j=1;j<=al;j++)
			{
				if(a[j]==b[i])  
					f[i%2][j]=f[(i-1)%2][j-1]+1;
				else if(f[(i-1)%2][j]>f[i%2][j-1])
					f[i%2][j]=f[(i-1)%2][j];
				else
					f[i%2][j]=f[i%2][j-1];
				
			}
			
			if(f[0][al]>f[1][al])
				f[1][al]=f[0][al];
			
			printf("%d\n",f[1][al]);
			
			
			
			
	}
	
	

}


 

你可能感兴趣的:(算法,工作,测试)