HDU - 1501 Zipper

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1501

#include <iostream>
#include <string.h>
using namespace std;
/****************************************************************************************************************
            题意:给定三个字符串 s1,s2,s3。判断s3是否可以通过s1,s2字符的顺序得到
            思路:
            1,刚开始也是想到搜索之类的,然后看到网上说记忆化搜索!记忆化,换而言之就是dp啊
            2,最优子结构分析:如上例,如果A、B可以组成C,那么,C最后一个字母e,必定是 A 或 C 的最后一个字母组成。
            3,C去除除最后一位,就变成是否可以求出 A-1和B 或者 A与B-1 与 是否可以构成 C-1
            4,状态转移方程:
                用f[i][j] 表示 表示A前 i 为 和B 前j 位是否可以组成 C的前i+j位
                dp[i][j]= (dp[i-1][j]&&(a[i]==c[i+j]))||(dp[i][j-1]&&(b[j]==c[i+j]))
****************************************************************************************************************/
string s1,s2,s3;
int dp[205][205];
int main()
{
    int T;
    cin>>T;
    int num=1;
    while(T--)
    {
        cin>>s1>>s2>>s3;

        memset(dp,0,sizeof(dp));
        for(int i = 0;i < s1.size();i ++)
            if(s1[i] == s3[i])
                dp[i+1][0]=1;
        for(int i = 0;i < s2.size();i ++)
            if(s2[i] == s3[i])
                dp[0][i+1]=1;

        for(int i = 1;i <= s1.size();i ++)
            for(int j = 1;j <= s2.size();j ++)
                dp[i][j]=((dp[i-1][j] && s1[i-1] == s3[i+j-1]) || (dp[i][j-1] && s2[j-1] == s3[i+j-1]));
        cout<<"Data set "<<num++<<": ";
        if(dp[s1.size()][s2.size()])
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}


你可能感兴趣的:(HDU - 1501 Zipper)