[POJ]Zipper[动态规划]
2017-10-24 13:20
302 查看
这个转载于我原来的小号emmmm,我也不知为什么自己绑定了QQ之后就只能用这个了,可能我很久以前就有了CSDN账号???
内容部分(题目)
输入 输入测试次数n; 每一次测试,分别输入string a,b和all; 输出 如果,a,b串,在 all中可以按顺序找到,就输出"yes" 否则就输出"no" 例如: cat tree tcraete 这个是要输出 yes的 111 000 101001 这个也是要输出yes的 111 000 111100 这个是要输出no的 //很明显嘛,用01串是会忽略很多种情况的。不过我还没想过通过排除所有不可能的方式来完成呢。有兴趣的哥们完成了,可以评论下。一起研究。 //不过用01串很直观嘛
这里采用动态规划实现
代码如下:#include<iostream> #include<cstring> #include<algorithm> using namespace std; string a,b,all; bool Arr[1000][1000];//Arr[i][j]表示 以 a[i]和b[j]结束的串在不在其中 在 = true,或者 不在 = false ; int find(char c,int no = -1)//no表示不是坐标no { for (int i = 0;i<all.length();++i){ if (all[i]==c&& i != no)return i; } return -1; } void oper(){ int pp1= find(a[0]); int pp2=find(b[0],pp1);//得到在pp2 != pp1的前提下找到了b[0]的开头,还是从前面找 if (pp2 == -1){//通过这种方式的寻找,确保了,最后一个元素在两者中都存在 cout <<"no"<<endl;return; }//这是一种可能,在这种可能之下 Arr[0][0] = true; if(pp1 > pp2){ for (int i=pp2+1;i<pp1;++i){ if (b[i] != all[i]){ cout<< "no"<<endl;return; } Arr[0][i] = true; } }else { for (int i=pp1+1;i<pp2;++i){ if (a[i] != all[i]){ cout<< "no"<<endl;return; } Arr[i][0] = true; } }//要明白一点,两个开头的位置之间的字符必定是属于前面那个字符所对应的字符串的 //至此,就开始遍历所有的起始位置 ,两个位置都划归到了同一位置 //进行斜着的填表过程,每一斜行,都有,横纵坐标相加都是相等的,就是说,考虑的都是对于all来说,都是前面的 //cat tree tcraete int p=max(pp1,pp2)+1;//用 p来表示需要处理的all 的第p个元素(从0开始计数),其实很明显可以看到 //目前,指定到了准确的位置 while(p < all.length()){//p表示第p个元素,就是表示第p斜行 for(int i=0;i<=p;++i){//对于这个第p个元素,只有三种可能,第一,这个属于a[i],第二,这个属于b[j],第三个,都不属于,则返回; bool aB=false,bB=false; if (i>=1){ if(a[i] == all[p]) aB = Arr[i-1][p-i-1]; } if (p-i-1>=1){ if(b[p-i-1] == all[p]) bB = Arr[i][p-i- bf77 2]; } Arr[i][p-i-1]= aB||bB; } ++p; } if(Arr[a.length()-1][b.length()-1])cout <<"yes"<<endl; else cout << "no"<<endl; return; } int main(){ int n,caseNo = 0; cin >>n; while (n--){ cin >> a>>b>>all; cout <<"Data set "<< ++caseNo<<": "; if(a.length() + b.length() != all.length()){ cout << "no"<<endl; continue; } memset(Arr,false,sizeof(Arr)); oper(); } }
欢迎关注我用于做笔记的公众号:肥宅Sean笔记
相关文章推荐
- 【动态规划】POJ - 2192 Zipper
- POJ 2192-zipper(动态规划)
- poj2192——Zipper(动态规划)
- 动态规划 背包问题 poj 1837 Balance
- poj 3616 Milking Time ---DP(带权重的区间动态规划)
- poj 2609 动态规划
- POJ 1050 二维动态规划转变成枚举加一维的动态规划!
- POJ-3034 Whac-a-Mole 动态规划
- POJ 1260 Pearls 【动态规划】
- poj1088滑雪,记忆搜索,动态规划问题
- M - Help Jimmy POJ - 1661【动态规划】
- poj 1159 动态规划
- POJ2342 树型动态规划
- POJ 2948 - 典型动态规划
- POJ_2663_Tri Tiling_DFS,状态压缩,动态规划
- POJ 1976 A Mini Locomotive (动态规划)
- POJ 3666 Making the Grade(动态规划)
- POJ 2479 Maximum sum 动态规划 最大子段和 最大子段积
- POJ 动态规划题目列表
- POJ 2184 Cow Exhibition (动态规划)