【POJ2192】Zipper(动态规划)
2011-04-22 11:23
323 查看
这个题目要求判断2个字符串能否组成1个字符串,例如cat和tree能组成tcraete。我们定义一个布尔类型的二维数组 array,array[i][j]表示str1[i]和str2[j]能否组成str[i+j].i=0或者j=0表示空字符串,所以初始化时,array[0][j]表示str1的前j个字符是否和str都匹配。
对于str=tcraete:
可以证明:当array[i-1][j]( array[i][j]上面一格)和array[i][j-1]( array[i][j]左面一格)都为0时,array[i][j]为0.当array[i-1][j]( array[i][j]上面一格)为1且左面字母为str[i+j]时或者当array[i][j-1](
array[i][j]左面一格)为1且上面字母为str[i+j]时,array[i][j]为1.这就是状态转移方程为。
对于str=tcraete:
Null | c | a | t | |
Null | 1 | 0 | 0 | 0 |
t | 1 | |||
r | 0 | |||
e | 0 | |||
e | 0 |
array[i][j]左面一格)为1且上面字母为str[i+j]时,array[i][j]为1.这就是状态转移方程为。
#include <iostream> #include <string> using namespace std; bool arr[202][202]; int main(){ string st1,st2,st3; int n; cin>>n; for(int x=1;x<=n;x++){ cin>>st1>>st2>>st3; arr[0][0]=1; for (int i=1;i<=st1.length();i++) if(st3[i-1]==st1[i-1]) arr[i][0]=1; for (int i=1;i<=st2.length();i++) if(st3[i-1]==st2[i-1]) arr[0][i]=1; for (int i=1;i<=st1.length();i++){ for (int j=1;j<=st2.length();j++){ if(arr[i][j-1]&&st2[j-1]==st3[i+j-1]|| arr[i-1][j]&&st1[i-1]==st3[i+j-1]) arr[i][j] = true; else arr[i][j] = false; } } cout<<"Data set "<<x<<": "<< ((arr[st1.length()][st2.length()]==1)?("yes"):("no")) <<endl; } }
相关文章推荐
- hdu1501 Zipper 动态规划
- poj2192 - Zipper
- poj2192 Zipper(DP)
- 动态规划入门——Zipper
- Zipper(动态规划)
- 动态规划 - hdu1501 - poj2192
- POJ2192:Zipper(记忆化搜索)
- POJ2192(Zipper)
- POJ 2192-zipper(动态规划)
- hdu1501 zipper【记忆化搜索】【动态规划】
- 077day(动态规划题(Zipper)的尝试)
- POJ2192 - Zipper(区间DP)
- poj2192 Zipper(dp)
- HDU 1501 Zipper 动态规划经典
- POJ 2192-zipper(动态规划)
- HDU 1501 Zipper 动态规划经典
- POJ2192:Zipper(DP)
- POJ2192 Zipper(简单DP)
- poj2192 Zipper
- Zipper(poj2192)dfs+剪枝