hoj1447 Compromise
#include <iostream> #include <vector> #include <cstring> using namespace std; struct point { int len; int pi,pj; //char str[31]; string str; }; point p[101][101]; int max(int x,int y) { return (x>y?x:y); } int main(int args,char** argv) { vector<string> vs1; vector<string> vs2; char tch[31]; while(cin>>tch) { vs1.clear(); vs2.clear(); while(tch[0]!='#') { vs1.push_back(tch); cin>>tch; }//while cin>>tch; while(tch[0]!='#') { vs2.push_back(tch); cin>>tch; }//while for(int i=0;i<vs1.size();i++) { for(int j=0;j<vs2.size();j++) { p[i][j].len=0; p[i][j].pi=-1; p[i][j].pj=-1; p[i][j].str=""; }//for }//for for(int i=0;i<vs1.size();i++) { for(int j=0;j<vs2.size();j++) { //int if(vs1[i]==vs2[j]) { if(i>0&&j>0) { //string s=vs1[i]; p[i][j].len=p[i-1][j-1].len+1; p[i][j].pi=i; p[i][j].pj=j; p[i][j].str=vs1[i]; } else { p[i][j].len=1; //strcpy(p[i][j].str,vs1[i]); p[i][j].str=vs1[i]; p[i][j].pi=i; p[i][j].pj=j; } }//if else { int tmp1=0,tmp2=0; if(i>0) tmp1=p[i-1][j].len; if(j>0) tmp2=p[i][j-1].len; p[i][j].len=max(tmp1,tmp2); if(tmp1>tmp2) { p[i][j].pi=p[i-1][j].pi; p[i][j].pj=p[i-1][j].pj; //strcpy(p[i][j].str,p[i-1][j].str); //p[i][j].str=p[i-1][j].str; } else if(tmp1<tmp2) { p[i][j].pi=p[i][j-1].pi; p[i][j].pj=p[i][j-1].pj; //strcpy(p[i][j].str,p[i][j-1].str); //p[i][j].str=p[i][j-1].str; } else { if(j>0) { p[i][j].pi=p[i][j-1].pi; p[i][j].pj=p[i][j-1].pj; //strcpy(p[i][j].str,p[i][j-1].str); //p[i][j].str=p[i][j-1].str; } else if(i>0) { p[i][j].pi=p[i-1][j].pi; p[i][j].pj=p[i-1][j].pj; //strcpy(p[i][j].str,p[i-1][j].str); //p[i][j].str=p[i-1][j].str; } }//else }//else }//for }//for int i=vs1.size(); int j=vs2.size(); //cout<<p[i-1][j-1].len<<endl; int k=p[i-1][j-1].len,itmp,jtmp,ii,jj; vs1.clear(); itmp=i-1; jtmp=j-1; while(k--) { if(p[itmp][jtmp].str=="") { ii=p[itmp][jtmp].pi; jj=p[itmp][jtmp].pj; vs1.push_back(p[ii][jj].str); //cout<<p[ii][jj].str<<" "; itmp=ii-1; jtmp=jj-1; } else { vs1.push_back(p[itmp][jtmp].str); //cout<<p[itmp][jtmp].str<<" "; itmp=itmp-1; jtmp=jtmp-1; } } //cout<<vs1.size(); for(int i=vs1.size()-1;i>0;i--) cout<<vs1[i]<<" "; cout<<vs1[0]<<endl; }//while return 0; }
http://acm.hit.edu.cn/hoj/problem/view?id=1447
dp,最长公共子序列问题,不过需要存储公共的字符串。