标签:
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
题意: 这个题目和书上的Lcs 问题差不多 但是他的元素不再是字符
变成了 每个元素都是单词也就是字符串
方程:
LCS(i,j)表示数组以数组1的i个为止和以数组2的第j个为止的最长公共子序列,注意是第i个字符为子串的末尾字符(这样才能达到无后效性的目的)
1.LCS(i-1,j-1)+1 (a【i】=b【j】)
LCS(i,j)={
2.max{LCS(i-1,j),LCS(i,j-1)} (a【i】!=b【j】)
#include<iostream> #include<cstring> #include<string> #include<vector> using namespace std; vector<string> st1,st2; int dp[110][110],path[110][110]; int tag; void printpath(int x,int y){ if(x==0||y==0) return; if(path[x][y]==1){ printpath(x-1, y-1); if(tag==0){ cout<<st1[x-1]; tag=1; } else cout<<" "<<st1[x-1]; } else if(path[x][y]==2) printpath(x-1, y); else if(path[x][y]==3)printpath(x, y-1); } int main(){ string str; while(cin>>str){ st1.clear();st2.clear(); st1.push_back(str); while(cin>>str&&str!="#") st1.push_back(str); while(cin>>str&&str!="#") st2.push_back(str); memset(dp,0,sizeof(dp)); memset(path,0,sizeof(path)); int len1=st1.size(),len2=st2.size(); tag=0; for(int i=1;i<=len1;i++){ for(int j=1;j<=len2;j++){ if(st1[i-1]==st2[j-1]){ dp[i][j]=dp[i-1][j-1]+1; path[i][j]=1; }else if(dp[i-1][j]>dp[i][j-1]){ dp[i][j]=dp[i-1][j]; path[i][j]=2; }else{ dp[i][j]=dp[i][j-1]; path[i][j]=3; } } } printpath(len1, len2); cout<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/demodemo/p/4732496.html