1501 Zipper

来源:互联网 发布:中俄关系 知乎 编辑:程序博客网 时间:2024/05/17 07:26

http://acm.hdu.edu.cn/showproblem.php?pid=1501

首先先定义一个bool类型的2维数组p[201][201 ]用来表示s1[ i ]   、s2[ j ] 能否组成s[ i + j ] 。能则p[ i ][ j ] = 1,反之为0.

然后进行初始化。

p[0][0]  = 1 ;

p[0][ j ] 和 p[ i ][0]分别表示第一个字符串和第二个字符串为空串的情况。以p[ i ][0]为例,如果s1[ i ] = s[ i ] (注:这里s[ i ]为第三个字符串),则p[ i ][ 0 ] = 1, 反之为0.


如果p[ i-1 ][ j ] 与 p[ i ][ j-1 ] 同时为 0 ,则p[ i ][ j ] 赋值为0,即s1[ i ]  与 s2[ j ] 不能构成满足条件的s[ i + j];

如果( p[ i-1 ][ j ] == 0 &&  s1[ i ] == s[ i+j ]  )  || (p[ i ][ j-1 ] == 0 &&  s1[ j ] == s[ i+j ]  )

则 p[ i ][ j ] = 1;

原理就是假定第三个字符串s的前 i+j-1个字符都满足条件,如果最后一个字符也满足条件的话,那么就 yes

#include<iostream>#include<cstring>using namespace std;bool p[201][201];int main(){char s1[201],s2[201],s[401];int l1,l2,t;int i,j,u=0;scanf("%d",&t);while(u++<t){int tag = 1;scanf("%s%s%s",s1+1,s2+1,s+1);l1 = strlen(s1+1);l2 = strlen(s2+1);p[0][0] = 1;for(i=1;i<=l1;i++)   /*初始化*/if(s1[i] == s[i]) p[i][0] =  1;else p[i][0] = 0;for(i=1;i<=l2;i++)if(s2[i] == s[i])p[0][i] =  1;else p[0][i] = 0;for(i=1;i<=l1;i++)for(j=1;j<=l2;j++)p[i][j] = ((p[i-1][j]&& s1[i] == s[i+j])||(p[i][j-1]&&s2[j]==s[i+j]));printf("Data set %d: ",u);printf(p[l1][l2]?"yes\n":"no\n");}return 0;}




原创粉丝点击