Compromise[2250@pku]

Compromise[2250@pku]

// @pku DY问题完整的LCS问题
// 采用迭代的方法
// 标志数组的初始化很重要,让s1,s2的下标从1开始很方便设置边界检测
#include<iostream>
#include< string>
#include<vector>
#include<algorithm>
using  namespace std;


#define N 120
#define Left -1
#define Up 1
#define NW    0
#define fin cin
int flag[N][N];
int dir[N][N];

vector< string> s1,s2,res;
void len();
void Output( int i, int j);
int main()
{
     // ifstream fin("input.txt");
     string s;
     while(1){
        s1.clear();
        s2.clear();
        res.clear();
         while(1)
        {
            fin>>s;
             if(s=="#")
                 break;
            s1.push_back(s);
        }
         while(fin>>s){
             if(s=="#")
                 break;
            s2.push_back(s);
        }
        len();
        Output(s1.size(), s2.size());
         bool first= true;
         for( int i=0;i<res.size();i++)
        {
             if(first){
                first= false;
            }
             else
                cout<<" ";
            cout<<res[i];
        }
        cout<<endl;
         if(fin.eof())
             break;
    } // end while
     return 0;

}


void len()
{
     for( int i=0;i<=s1.size();i++)
        flag[i][0]=0;
     for( int j=0;j<=s2.size();j++)
        flag[0][j]=0;
    
     for( int i=1;i<=s1.size();i++)
    {
         for( int j=1;j<=s2.size();j++)
        {
             if(s1[i-1]==s2[j-1])
            {
                flag[i][j]=1+flag[i-1][j-1];
                dir[i][j]=NW;
            }
             else
            {
                flag[i][j]=max(flag[i-1][j],flag[i][j-1]);
                 if(flag[i-1][j]<flag[i][j-1])
                    dir[i][j]=Left;
                 else
                    dir[i][j]=Up;
            }
        }
    }
}

void Output( int i, int j)
{
     if(i==0 || j==0)
         return ;
     if(dir[i][j]==NW)
    {
        Output(i-1,j-1);
        res.push_back(s1[i-1]);
    }
     else
    {
         if(dir[i][j]==Up)
            Output(i-1,j);
         else
            Output(i,j-1);
    }
}

你可能感兴趣的:(Compromise[2250@pku])