POJ 1934 Trip G++ 输出最长公共子序列 dp dfs没掌握

xiaoxiao2021-02-28  122

#include <iostream> #include <string> #include <cstring> #include <vector> #include <algorithm> #include <cstdio> using namespace std; //英语 看博友分析 抄博友程序 输出最长公共子序列 dfs 没掌握 int f[1008][1008]; int g[1008][40]; int h[1008][40]; vector<string> ve; int tot; string ans[1008]; void dfs(int x,int y,int l,string s)//抄博友程序 { //cout<<x<<" "<<y<<" "<<l<<" "<<s<<endl; if(l==0) { ve.push_back(s); return; //ans[++tot] = s; //return; } if(x==0 || y==0) { return; } for(int i=0;i<26;i++) { int tx=g[x][i]; int ty=h[y][i]; if(f[tx][ty]==l)//抄博友程序 { //s=(char)(i+'a')+s;//wa dfs(tx-1,ty-1,l-1,(char)(i+'a')+s);//抄博友程序 tx-1 ty-1 没掌握 } } } /* int main() { int l1, l2; string s1, s2; cin >> s1 >> s2; l1 = s1.size(); l2 = s2.size(); s1 = ' ' + s1; s2 = ' ' + s2; for (int i = 1; i <= l1; i++) { for (int j= 1; j <= l2; j++) { if (s1[i] == s2[j]) f[i][j] = f[i - 1][j - 1] + 1; else f[i][j] = max(f[i - 1][j], f[i][j - 1]); } } for (int i = 1; i <= l1; i++) { for (int j = 1; j <= 26; j++) { if (s1[i] == j + 'a' - 1) g[i][j] = i; else g[i][j] = g[i - 1][j]; } } for (int i = 1; i <= l2; i++) { for (int j = 1; j <= 26; j++) { if (s2[i] == j + 'a' - 1) h[i][j] = i; else h[i][j] = h[i - 1][j]; } } dfs(l1, l2, f[l1][l2], ""); sort(ans + 1, ans + tot + 1); for (int i = 1; i <= tot; i++) cout << ans[i] << endl; return 0; }*/ int main() { char sa[1008],sb[1008]; scanf("%s%s",sa+1,sb+1); int al=strlen(sa+1); int bl=strlen(sb+1); for(int i=1;i<=al;i++) { for(int j=1;j<=bl;j++) { if(sa[i]==sb[j]) { f[i][j]=f[i-1][j-1]+1;//抄博友程序 }else { f[i][j]=max(f[i][j-1],f[i-1][j]); } } } /* for(int i=1;i<=al;i++) { for(int j=1;j<=bl;j++) { cout<<f[i][j]<<" "; } cout<<endl; } cout<<endl;*/ for(int i=1;i<=al;i++) { for(int j=0;j<26;j++) { if(sa[i]=='a'+j) { g[i][j]=i;//抄博友程序 }else { g[i][j]=g[i-1][j]; } } } /* for(int i=1;i<=al;i++) { for(int j=0;j<26;j++) { cout<<g[i][j]<<" "; } cout<<endl; } cout<<endl;*/ for(int i=1;i<=bl;i++)// { for(int j=0;j<26;j++) { if(sb[i]=='a'+j) { h[i][j]=i; }else { h[i][j]=h[i-1][j]; } } } /* for(int i=1;i<=bl;i++) { for(int j=0;j<26;j++) { cout<<h[i][j]<<" "; } cout<<endl; } cout<<endl;*/ dfs(al,bl,f[al][bl],""); sort(ve.begin(),ve.end()); for(int i=0;i<ve.size();i++) { cout<<ve[i]<<endl; } return 0; }

 

转载请注明原文地址: https://www.6miu.com/read-59767.html

最新回复(0)