poj2192 Zipper(DP+DFS)
2018-03-28 20:55
357 查看
POJ
DFS
DP
DP求解:定义dp[i][j]表示A中前i个字符与B中前j个字符是否能组成C中的前 (i+j) 个字符,如果能标记true,如果不能标记false;
有了这个定义,我们就可以找出状态转移方程了,初始状态dp[0][0] = 1:
dp[i][j] = 1 如果 dp[i-1][j] == 1 && C[i+j-1] == A[i-1]
dp[i][j] = 1 如果 dp[i][j-1] == 1 && C[i+j-1] == B[j-1]
DFS
#include<stdio.h> #include<string.h> #include<iostream> #include<vector> #include<set> #include<map> #include<queue> #include<ctype.h> 4000 #include<stack> #include<math.h> #include <string> #include<algorithm> using namespace std; typedef unsigned long long ULL; int la,lb,lc; char a[205],b[205],c[409]; int dfs(int x,int y,int sum) { if(sum>=lc) return 1; if(a[x]==c[sum]&&dfs(x+1,y,sum+1)) return 1; if(b[y]==c[sum]&&dfs(x,y+1,sum+1)) return 1; return 0; } int main() { ios::sync_with_stdio(false);cin.tie(0); int n; while(scanf("%d",&n)!=EOF) //挺玄学的,将这块改为cin>>n就错了,不知道为啥。。。 for(int i=1;i<=n;i++) { scanf("%s%s%s",a,b,c); la=strlen(a); lb=strlen(b); lc=strlen(c); int flag=0; if(a[la-1]==c[lc-1]||b[lb-1]==c[lc-1])//减枝。 flag=dfs(0,0,0); if(flag == 1) printf("Data set %d: yes\n",i); else printf("Data set %d: no\n",i); } return 0; }
DP
DP求解:定义dp[i][j]表示A中前i个字符与B中前j个字符是否能组成C中的前 (i+j) 个字符,如果能标记true,如果不能标记false;
有了这个定义,我们就可以找出状态转移方程了,初始状态dp[0][0] = 1:
dp[i][j] = 1 如果 dp[i-1][j] == 1 && C[i+j-1] == A[i-1]
dp[i][j] = 1 如果 dp[i][j-1] == 1 && C[i+j-1] == B[j-1]
#include<stdio.h> #include<string.h> #include<iostream> #include<vector> #include<set> #include<map> #include<queue> #include<ctype.h> #include<stack> #include<math.h> #include <string> #include<algorithm> using namespace std; char a[205],b[205],c[409]; int dp[205][205]; int main() { int n; scanf("%d",&n); for(int k=1;k<=n;k++) { memset(dp,0,sizeof(dp)); scanf("%s%s%s",a,b,c); int la=strlen(a); int lb=strlen(b); dp[0][0]=1; for(int i=0;i<=la;i++) for(int j=0;j<=lb;j++) { if(i>0&&dp[i-1][j]&&a[i-1]==c[i+j-1]) dp[i][j]=1; if(j>0&&dp[i][j-1]&&b[j-1]==c[i+j-1]) dp[i][j]=1; } printf("Data set %d: %s\n",k,dp[la][lb]==1?"yes":"no"); } return 0; }
相关文章推荐
- POJ2192 Zipper(DP||DFS)
- HDU 1501 Zipper(DP,DFS)
- hdu 1501 Zipper(dfs或dp)
- [POJ2192]Zipper(DFS,剪枝)
- POJ2192--Zipper(dp)
- 【DFS/DP】HDU1501Zipper
- hdu1501&&poj2192 Zipper(DFS)
- POJ 2192 Zipper (DFS / DP)
- POJ 2192 Zipper [dfs+剪枝 || dp]
- POJ2192 - Zipper(区间DP)
- hdoj Zipper 1501 (DP||DFS)两字符串组合为一个字符串
- POJ2192:Zipper(DP)
- HDU-1501 (POJ-2192) Zipper (DFS||DP)
- HDU 1501 Zipper(DP,DFS)
- poj2192 Zipper(DP)
- poj2192 Zipper(dp)
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
- POJ2192 Zipper(简单DP)
- HDU 1501 Zipper(DP,DFS)
- sicily 1010. Zipper dfs || dp