您的位置:首页 > 其它

POJ 2250

2015-06-10 17:13 288 查看
#include <iostream>
#include <stack>
#define MAXN 150
#include <string>

using namespace std;

int dp[MAXN][MAXN];
int mark[MAXN][MAXN];
string s_1[MAXN];
string s_2[MAXN];
stack <string> coll;

int main()
{
int i;
int j;
string tem;
int n_1;
int n_2;
//freopen("acm.acm","r",stdin);
while(cin>>tem)
{
s_1[0] = tem;
i = 1;
while(cin>>tem)
{
if(tem == "#")
{
break;
}
s_1[i ++] = tem;
}
n_1 = i;
i = 0;
while(cin>>tem)
{
if(tem == "#")
{
break;
}
s_2[i ++] = tem;
}
n_2 = i;
dp[0][0] = 0;
for(i = 0; i <= n_1; ++ i)
{
dp[i][1] = 0;
}
for(i = 0; i <= n_2; ++ i)
{
dp[1][i] = 0;
}
memset(mark,-1,sizeof(mark));
for(i = 0; i < n_1; ++ i)
{
for(j = 0; j < n_2; ++ j)
{
if(s_1[i] == s_2[j])
{
dp[i+1][j+1] = dp[i][j] + 1;
mark[i][j] = 1;    //相等来自i-1和j-1
}
else
{
if(dp[i+1][j] > dp[i][j+1])
{
dp[i+1][j+1] = dp[i+1][j];
mark[i][j] = 2;  // j-1方向
}
else
{
dp[i+1][j+1] = dp[i][j+1];
mark[i][j] = 3; // i-1方向
}
}
}
}

i = n_1-1;
j = n_2-1;

while(mark[i][j] != -1 && j >= 0 && i >= 0)
{
if(mark[i][j] == 1)
{
coll.push(s_1[i]);
-- i;
-- j;
}
else if(mark[i][j] == 2)
{
-- j;
}
else if(mark[i][j] == 3)
{
-- i;
}
}

while(!coll.empty())
{
cout<<coll.top()<<" ";
coll.pop();
}
cout<<endl;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: