【HDU 1501】Zipper(记忆化搜索)
生活随笔
收集整理的這篇文章主要介紹了
【HDU 1501】Zipper(记忆化搜索)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
我們記錄pos1 pos2 pos3 分別代表現在字符串1,2,3的位置
然后判斷pos1是否等于pos3 或者pos2是否等于pos3 分別進行dfs
然后我們發現是可以記憶化的
比方當pos1=pos3且pos2=pos3 那會先搜索pos1+1 那么在這一次的dfs 有可能就提前處理出之后會選擇的方式 那么當回溯之后 就會再去走這樣的方式 浪費了很多時間
所以只需標記一下vis[pos1][pos2] 之后走到這兒就直接return
#include<bits/stdc++.h> #define N 1005 using namespace std; int n,len1,len2,len3; string s1,s2,s3; bool ans,vis[N][N]; void dfs(int pos1,int pos2,int pos3) //在字符串1 2 3 中的位置 {if(pos1==len1&&pos2==len2) //已經超出了 {ans=true;return;}if(s1[pos1]!=s3[pos3]&&s2[pos2]!=s3[pos3]) return;if(vis[pos1][pos2]) return; //中途截斷 vis[pos1][pos2]=true; if(s1[pos1]==s3[pos3]) dfs(pos1+1,pos2,pos3+1);if(s2[pos2]==s3[pos3]) dfs(pos1,pos2+1,pos3+1); } int main() {ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);cin>>n;for(int i=1;i<=n;i++){cin>>s1>>s2>>s3;memset(vis,false,sizeof(vis));ans=false;len1=s1.length(); len2=s2.length(); len3=s3.length();dfs(0,0,0);if(ans) cout<<"Data set "<<i<<": yes"<<endl;else cout<<"Data set "<<i<<": no"<<endl;}return 0; }轉載于:https://www.cnblogs.com/Patrickpwq/articles/9810405.html
總結
以上是生活随笔為你收集整理的【HDU 1501】Zipper(记忆化搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态判断时间插件显示到年月日时分秒
- 下一篇: pe的u盘怎么装系统教程 pe U盘装系