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; }