标签:
Description
Input
Output
Sample Input
die einkommen der landwirte sind fuer die abgeordneten ein buch mit sieben siegeln um dem abzuhelfen muessen dringend alle subventionsgesetze verbessert werden # die steuern auf vermoegen und einkommen sollten nach meinung der abgeordneten nachdruecklich erhoben werden dazu muessen die kontrollbefugnisse der finanzbehoerden dringend verbessert werden #
Sample Output
die einkommen der abgeordneten muessen dringend verbessert werden
题解:
题意:第一眼看,输入的东西有点长啊,仔细读了读,发现就是找到一个最长公共子序列并打印。
分析:找到最长公共子序列不难,难的是打印它的一条路径。我们知道是用二维数组dp来保存它的匹配数。一旦有匹配的它就会修改后面的值,保证了
如何一个状态当前的dp数据中是最大的值。为了记录它路径。我们需要用数组t来记录。可以用递归来实现。
可能这样说太抽象了,附上一张二维图。
ABCBDAB
BDCABA
两个序列,求最长公共子序列。图中就是路径回溯
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int t[110][110],dp[110][110]; string a[110],b[110]; void lcs(int x,int y) { for(int i=1; i<=x; i++) for(int j=1; j<=y; j++) { if(a[i]==b[j]) { dp[i][j]=dp[i-1][j-1]+1; t[i][j]=1; } else { if(dp[i][j-1]<=dp[i-1][j]) { dp[i][j]=dp[i-1][j]; t[i][j]=2; } else { dp[i][j]=dp[i][j-1]; t[i][j]=3; } } } } void output(int x,int y) { if(x==0||y==0) return; if(t[x][y]==1) { output(x-1,y-1); cout<<a[x]<<" "; } else if(t[x][y]==2) output(x-1,y); else if(t[x][y]==3) output(x,y-1); } int main() { string s; while(cin>>s) { int m=2,n=1; a[1]=s; while(cin>>s&&s!="#") { a[m++]=s; } while(cin>>s&&s!="#") { b[n++]=s; } lcs(m,n); output(m,n); cout<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/hfc-xx/p/4726771.html