"巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场 Combine String
2016-05-29 10:47
357 查看
题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1006&cid=714
题意:给你两个字符串a和b,再给你一个字符串c,问你c可不可以分成两个a和b的子串。
此题我们考虑c串的每一位,c的每一位前面的都可能是a的前i个数和b的前j个数组成,那么我们可以去枚举每一种组合情况。
我们用dp[i][j]来表示在枚举到第i+j位的时候,枚举到a串的第i位和b串的第j位是否满足的情况,那么我们的状态转移方程:
(1) 当枚举的当前位(i+j)与a串枚举的当前位(i)一样时,即c[i+j] == a[i]时,如果dp[i-1][j]==1,那么dp[i][j] = 1;
(2) 当枚举的当前位(i+j)与b串枚举的当前位(j)一样时,即c[i+j] == a[j]时,如果dp[i][j-1]==1,那么dp[i][j] = 1;
题意:给你两个字符串a和b,再给你一个字符串c,问你c可不可以分成两个a和b的子串。
此题我们考虑c串的每一位,c的每一位前面的都可能是a的前i个数和b的前j个数组成,那么我们可以去枚举每一种组合情况。
我们用dp[i][j]来表示在枚举到第i+j位的时候,枚举到a串的第i位和b串的第j位是否满足的情况,那么我们的状态转移方程:
(1) 当枚举的当前位(i+j)与a串枚举的当前位(i)一样时,即c[i+j] == a[i]时,如果dp[i-1][j]==1,那么dp[i][j] = 1;
(2) 当枚举的当前位(i+j)与b串枚举的当前位(j)一样时,即c[i+j] == a[j]时,如果dp[i][j-1]==1,那么dp[i][j] = 1;
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define LL long long const int N = 2100; int dp ; int main() { char s1 , s2 , s[N*2]; while(scanf("%s%s%s", s1+1, s2+1, s+1)!=EOF) { int len1=strlen(s1+1), len2=strlen(s2+1), i, j; int len = strlen(s+1); if(len1+len2!=len) { printf("No\n"); continue; } memset(dp,0,sizeof(dp)); dp[0][0] = 1; for(i=0; i<=len1; i++) for(j=0; j<=len2; j++) { if(i==0 && j==0) continue; if(s1[i]==s[i+j] && dp[i-1][j] && !dp[i][j]) dp[i][j] = dp[i-1][j]; if(s2[j]==s[i+j] && dp[i][j-1] && !dp[i][j]) dp[i][j] = dp[i][j-1]; } if(dp[len1][len2]) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- python 中 list 列表 的十种操作方法:添加,插入,弹出,删除,延长,运算,查找,排序,反转,采用递归函数深度遍历list
- Matlab作图后,使用data cursor实现显示多个点的数据值
- MySQL中的多表查询
- 原生JavaScript编写canvas版的连连看游戏
- java内存区域理解-初步了解
- Ceph剖析:数据分布之CRUSH算法与一致性Hash
- javascript笔试题(3)
- 三种静态查找的思路及具体实现
- 两种方法求解逆序对
- 快速排序算法(Java语言)
- 练习三1019
- 1004-D专题三
- 灵活的坐标系变换:CSS的position定位方式
- Hdu-5301 Buildings(思维题)
- 动态规划1017
- Redis的Monitor监视器
- android 自定义ListView实现下拉刷新
- HTTPS的学习
- Shell-WEB目录监控
- 第二章-jQuery选择器