POJ - 2192 - Zipper (简单DP)

来源:互联网 发布:mysql数据库租用 编辑:程序博客网 时间:2024/06/15 07:27


题目传送:Zipper


思路:设状态dp[i][j]为字符串A前i个字符和B前j个字符能否组成C的前i+j个字符,边界为dp[0][0] = 1能则为true,否则false


AC代码:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <deque>#include <cctype>#define LL long long#define INF 0x7fffffffusing namespace std;char A[205];char B[205];char C[405];int T;int dp[205][205];int main() {scanf("%d", &T);int cas = 1;while(T --) {scanf("%s %s %s", A + 1, B + 1, C + 1);int lena = strlen(A + 1);int lenb = strlen(B + 1);int lenc = strlen(C + 1);memset(dp, 0, sizeof(dp));dp[0][0] = 1;for(int i = 0; i <= lena; i ++) {for(int j = 0; j <= lenb; j ++) {if(i > 0 && A[i] == C[i+j] && dp[i-1][j] == 1) {dp[i][j] = 1;}if(j > 0 && B[j] == C[i+j] && dp[i][j-1] == 1) {dp[i][j] = 1;}}}if(dp[lena][lenb] == 1) {printf("Data set %d: yes\n", cas ++);}else {printf("Data set %d: no\n", cas ++);}}return 0;}






刚开始的思路是算出A与C的LCS和B与C的LCS,如果满足A和B都是C的子序列的话且所有字母都相同数目一样则输出yes,但是有漏洞,比如ab, ab, baba,对于A是B或B是A的子串的时候就不对了


用LCS做的代码(贴一下,谨记):

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <deque>#include <cctype>#define LL long long#define INF 0x7fffffffusing namespace std;int T;char s1[205], s2[205], s3[405];int num1[26], num2[26];int dp[205][405], dp2[205][405];int main() {scanf("%d", &T);int cas = 1;while(T --) {memset(num1, 0, sizeof(num1));memset(num2, 0, sizeof(num2));scanf("%s %s %s", s1 + 1, s2 + 1, s3 + 1);int len1 = strlen(s1 + 1);int len2 = strlen(s2 + 1);int len3 = strlen(s3 + 1);for(int i = 1; i <= len1; i ++) {num1[s1[i] - 'a'] ++;}for(int i = 1; i <= len2; i ++) {num1[s2[i] - 'a'] ++;}for(int i = 1; i <= len3; i ++) {num2[s3[i] - 'a'] ++;}printf("Data set %d: ", cas ++);int flag = 1;for(int i = 0; i < 26; i ++) {if(num1[i] != num2[i]) {flag = 0;break;}}if(flag == 0) {printf("no\n");continue;}memset(dp, 0, sizeof(dp));memset(dp2, 0, sizeof(dp2));for(int i = 1; i <= len1; i ++) {for(int j = 1; j <= len3; j ++) {if(s1[i] == s3[j]) {dp[i][j] = dp[i-1][j-1] + 1;}else {dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}}for(int i = 1; i <= len2; i ++) {for(int j = 1; j <= len3; j ++) {if(s2[i] == s3[j]) {dp2[i][j] = dp2[i-1][j-1] + 1;}else {dp2[i][j] = max(dp2[i-1][j], dp2[i][j-1]);}}}if(dp[len1][len3] != len1 || dp2[len2][len3] != len2) {flag = 0;}if(flag) {printf("yes\n");}else printf("no\n");} return 0;}







0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玻璃门上轴坏了怎么办 配筋面积小了怎么办 ps大文件存不了怎么办 挑架钢丝绳拉环未预埋怎么办 出现偏拉的梁怎么办 尾插不好上锡怎么办 汽车玻璃上的焊点很难去除怎么办 拆苹果硬盘焊点掉了怎么办 玻璃被电焊滴到怎么办 gta5特质卡宾装了消音器怎么办 联想V形底座不好用怎么办 华为手环不计步怎么办 小米手环不计步怎么办 小米手环骑自行车不计步数怎么办 放逐之城着火了怎么办 城市天际线地价过低怎么办 放逐之城铁采完怎么办 车钥匙反锁车内怎么办 眼镜用热水洗了怎么办 眼镜放平后眼镜腿不平怎么办 瞄准镜十字歪了怎么办 瞄准镜调到底了怎么办 墨镜镜片刮花了怎么办 usb小风扇不转怎么办 金属眼镜压歪了怎么办 眼镜被电焊打了怎么办 电焊闪的眼睛疼怎么办 烧了电焊眼睛疼怎么办 用了电焊眼睛痛怎么办 烧电焊脸上红痛怎么办 眼睛让电焊晃了怎么办 眼被电焊打了怎么办 眼镜弹簧腿坏了怎么办 眼镜框铰链坏了怎么办 金属眼镜框歪了怎么办 眼镜框螺丝断了怎么办 眼镜被压变形了怎么办 金属眼镜腿断了怎么办 眼镜弹簧腿断了怎么办 眼镜腿螺丝太紧怎么办 眼镜金属柄断了怎么办