hdu_5707_Combine String("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5707
题意:给你三个字符串 a,b,c,问你 c能否拆成a,b,a,b串的每一个字符在c中不能变
题解:当时打再现赛的时候没根据题目的特殊性而在哪xjb搜,艹,设dp[i][j]表示为c的前i个字符可由a的前j个字符与b的前i-j个字符组合,dp[i][j]=0表示行不通,dp[i][j]=1,表示能行
,然后判断是否存在dp[lenc][lena]这个状态,如果lenc!=lena+lenb,那么直接输出No。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #define F(i,a,b) for(int i=a;i<=b;i++) 4 5 char a[2011],b[2011],c[2011],dp[2011][2011]; 6 int lena,lenb,lenc; 7 8 int main(){ 9 while(~scanf("%s%s%s",a,b,c)){ 10 lena=strlen(a),lenb=strlen(b),lenc=strlen(c); 11 if(lena+lenb!=lenc){puts("No");continue;} 12 memset(dp,0,sizeof(dp)),dp[0][0]=1; 13 F(i,0,lenc-1)F(j,0,i){ 14 if(!dp[i][j])continue; 15 if(c[i]==a[j])dp[i+1][j+1]=1; 16 if(c[i]==b[i-j])dp[i+1][j]=1; 17 } 18 if(dp[lenc][lena])puts("Yes"); 19 else puts("No"); 20 } 21 return 0; 22 }