POJ 2192 (DP)

题目:http://poj.org/problem?id=2192

 

题意:从a、b串组合出c串,如果可以,输出“yes”,否则输出“no”

      组合规则:不能乱序,只能顺序从a.b串中去字符。

 

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

char a[201],b[201],c[402];
/*
flag[i][j]== true ;表示 a的前i个,b的前j个可以组合出c的前i+j个 
flag[i][j]== false;表示 a的前i个,b的前j个不可以组合出c的前i+j个
*/
bool flag[201][201];

int main()
{
    int T,la,lb,i,j,cc=1;
    scanf("%d",&T);
           
       do
       {
          scanf("%s%s%s",a,b,c);
          la = strlen(a);         
          lb = strlen(b);
          memset(flag,false,sizeof(flag));
          
          flag[0][0] = true;//都是空的,起点设置为true 
                   
          for(i = 0 ; i <= la ; ++i )          
          for(j = 0 ; j <= lb ; ++j )
          {
                if( i>0 && flag[i-1][j] && a[i-1] == c[i+j-1])  flag[i][j] = 1;
                if( j>0 && flag[i][j-1] && b[j-1] == c[i+j-1])  flag[i][j] = 1; 
          }
         
          printf("Data set %d: ",cc++);//刚开始把这个变量设置为c,害我调试好久 
          if(flag[la][lb])
            puts("yes");
          else 
            puts("no");
                    
       }while(--T);
       
    //system("pause");
    return 0;    
}

 

 

posted @ 2012-05-11 17:16  开开甲  阅读(182)  评论(0编辑  收藏  举报