1017 防盗门系统

来源:互联网 发布:淘宝加盟靠谱吗 编辑:程序博客网 时间:2024/04/27 23:14
 

防盗门系统

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

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

 

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

 

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

输入

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

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

输出

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

样例输入
210100001110001010
样例输出
23
提示

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];elsef[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]);}}


 

原创粉丝点击