您的位置:首页 > 其它

POJ_3356_LCS

2010-05-09 10:10 127 查看
//============================================================================
// Name : POJ_3356_LCS.cpp
// Author : tiger
// Version :
// Copyright : Your copyright notice
// Description : LCS的变形
// 如果匹配的话 dp[i][j] = min (dp[i-1][j-1], dp[i-1][j] + 1, dp[i][j-1] + 1);
// 否则:dp[i][j] = min (dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1;
// 初始化:dp[0][i] = i; dp[i][0] = i;
//============================================================================

#include <iostream>
using namespace std;
int dp[2][1002];
int len1,len2;
char s1[1005],s2[1005];

int _LCS()
{
int current=0;
int i,j;
int max= len1>len1?len1:len2;
for(j = 0; j <= max;j++ )
{
dp[!current][j] = j;
dp[current][j] = 0;

}

for(i = 1; i <= len1; i++)
{
for(j = 1; j <= len2; j++)
{
if(j==1)
{
dp[current][j-1] = i;
dp[!current][j-1] = i-1;
}
if(dp[!current][j] < dp[current][j-1])
dp[current][j] = dp[!current][j]+1;
else
dp[current][j] = dp[current][j-1] +1 ;
if(s1[i] == s2[j] && dp[!current][j-1] < dp[current][j])
{
dp[current][j] = dp[!current][j-1];
}
else
{

if(dp[!current][j-1]+1 < dp[current][j] )
dp[current][j] = dp[!current][j-1] + 1;

}

//printf("%d ",dp[current][j]);
}
//printf("/n");
current = !current;
}
return dp[!current][j-1];
}
int main() {
freopen("in","r",stdin);
while(scanf("%d",&len1) != EOF )
{
if(len1)
scanf("%s",s1+1);

scanf("%d",&len2);
if(len2)
scanf("%s",s2+1);

if(len1 == 0 || len2 == 0)
{
printf("%d/n",len2+len1);
}else
{
printf("%d/n",_LCS());
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: