HDU 1501 & POJ 2192 Zipper(dp记忆化搜索)
2013-07-29 14:23
591 查看
题意:给定三个串,问c串是否能由a,b串任意组合在一起组成,但注意a,b串任意组合需要保证a,b原串的顺序 例如ab,cd可组成acbd,但不能组成adcb。
分析:对字符串上的dp还是不敏感啊,虽然挺裸的....dp[i][j] 表示a串前i个,b串前j个字母能组成c串前i+j个字母。所以dp[lena-1][lenb-1] = 1; 就行了。
从后往前找就很好找了,从c串最后一个字符开始递归搜索。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
# define MAX 222
using namespace std;
char a[MAX],b[MAX],c[MAX*2];
int dp[MAX][MAX];
int lena,lenb,lenc;
int dfs(int i,int j,int k) {
//cout << i << ' ' << j << ' ' << k << endl;
//cout << a[i] << ' ' << b[j] << ' ' << c[k] << endl;
if(dp[i][j] != -1 && i >=0 && j >=0) return dp[i][j];
if(k == 0 && (a[i] == c[k] || b[j] == c[k])) return 1;
if(i != -1 && a[i] == c[k]) {
dp[i][j] = max(dp[i][j],dfs(i-1,j,k-1));
}
if(j != -1 && b[j] == c[k]) {
dp[i][j] = max(dp[i][j],dfs(i,j-1,k-1));
}
if(dp[i][j] == -1)
dp[i][j] = 0;
return dp[i][j];
}
int main() {
//freopen("D:\\in.txt","r",stdin);
//freopen("D:\\out2.txt","w",stdout);
int T;
int casee = 1;
cin >> T;
while(T --) {
memset(dp,-1,sizeof(dp));
scanf("%s%s%s",a,b,c);
printf("Data set %d: ",casee++);
lena = strlen(a);
lenb = strlen(b);
lenc = strlen(c);
//cout << lena << ' ' << lenb << ' ' << lenc << endl;
if(lena + lenb != lenc) {
puts("no");
continue;
}
if(dfs(lena-1,lenb-1,lenc-1)) {
puts("yes");
}
else puts("no");
}
return 0;
}
分析:对字符串上的dp还是不敏感啊,虽然挺裸的....dp[i][j] 表示a串前i个,b串前j个字母能组成c串前i+j个字母。所以dp[lena-1][lenb-1] = 1; 就行了。
从后往前找就很好找了,从c串最后一个字符开始递归搜索。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
# define MAX 222
using namespace std;
char a[MAX],b[MAX],c[MAX*2];
int dp[MAX][MAX];
int lena,lenb,lenc;
int dfs(int i,int j,int k) {
//cout << i << ' ' << j << ' ' << k << endl;
//cout << a[i] << ' ' << b[j] << ' ' << c[k] << endl;
if(dp[i][j] != -1 && i >=0 && j >=0) return dp[i][j];
if(k == 0 && (a[i] == c[k] || b[j] == c[k])) return 1;
if(i != -1 && a[i] == c[k]) {
dp[i][j] = max(dp[i][j],dfs(i-1,j,k-1));
}
if(j != -1 && b[j] == c[k]) {
dp[i][j] = max(dp[i][j],dfs(i,j-1,k-1));
}
if(dp[i][j] == -1)
dp[i][j] = 0;
return dp[i][j];
}
int main() {
//freopen("D:\\in.txt","r",stdin);
//freopen("D:\\out2.txt","w",stdout);
int T;
int casee = 1;
cin >> T;
while(T --) {
memset(dp,-1,sizeof(dp));
scanf("%s%s%s",a,b,c);
printf("Data set %d: ",casee++);
lena = strlen(a);
lenb = strlen(b);
lenc = strlen(c);
//cout << lena << ' ' << lenb << ' ' << lenc << endl;
if(lena + lenb != lenc) {
puts("no");
continue;
}
if(dfs(lena-1,lenb-1,lenc-1)) {
puts("yes");
}
else puts("no");
}
return 0;
}
相关文章推荐
- HDU 1501 & POJ 2192 Zipper(dp记忆化搜索)
- POJ 2192 && HDU 1501 Zipper (记忆化搜索)
- hdu 1501 || poj 2192 Zipper(搜索:DFS)
- HDU-1501 (POJ-2192) Zipper (DFS||DP)
- hdu 1501 Zipper
- HDU 1258&&POJ 1564&&ZOJ 1711 DFS
- HDU 1501 Zipper(DP,DFS)
- POJ 2192 Zipper
- POJ 2636 && HDU 2304 Electrical Outlets(水~)
- Hdu 1063 & Poj 1001 Exponentiation (java 高精度实数 去除首尾0)
- HDU-1068 &&POJ-1466 Girls and Boys 简单二分图匹配
- hdu 4009 && POJ 3164
- hdu 1159 && POJ 1458Common Subsequence(LCS)
- POJ 1985 && BOJ 196 && HDU 2196
- UVa 439/HDU 1372/POJ 2243/ZOJ 1091 Knight Moves(BFS&纯数学方法)
- HDU 1159 && POJ 1458【lcs】
- poj -- 2778 DNA Sequence && hdu -- 2243 考研路茫茫——单词情结(AC自动机 + 矩阵)
- poj 3243 Clever Y&&hdu 2815 Mod Tree(扩展baby_step)
- POJ 3488 & HDU 1915 Arne Saknussemm(模拟)
- hdu 1501 Zipper 拉链