OpenJudge(Zipper)

链接:https://vjudge.net/problem/OpenJ_Bailian-2192
思路:用dp[i][j]表示第一个字符串使用前i个字符,第二个字符串使用j个字符能否与后面的长串匹配,那么下一个字符匹配要嘛和dp[i+1][j]相同,要嘛和dp[i][j+1]相同,所以建立状态转移。

代码:

#include
#include
#include
using namespace std;
string a,b,c;
const int maxn = 201;
int dp[maxn][maxn];

int main(){
    int t;
    cin>>t;
    int o=0;
    while(t--){
        cin>>a>>b>>c;
        memset(dp,0,sizeof(dp));
        dp[0][0] = 1;
        for(int i=0;i<=a.size();i++){
            for(int j=0;j<=b.size();j++){
                if(i>0&&dp[i-1][j]==1&&a[i-1]==c[i+j-1])dp[i][j] = 1;
                if(j>0&&dp[i][j-1]==1&&b[j-1]==c[i+j-1])dp[i][j] = 1;
            }
        }
        cout<<"Data set "<<++o<<": ";
        if(dp[a.size()][b.size()])
        cout<<"yes"<

你可能感兴趣的:(OpenJudge(Zipper))