hdu 1516(编辑距离+记录路径)

解题思路:这道题的基本模型就是编辑距离的模型,只是多了一个路径记录的过程。


学习一下:http://www.cnblogs.com/biyeymyhjob/archive/2012/09/28/2707343.html

最开始把问题搞错了,以为是两个串都可以做修改,无论我怎么想都不通。

回到这个题目上,这道题和最长公共子序列很相似,思路可以说是一样的,包括记录路径。

其实也就是根据递推数组的结果来判断。


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 85;
char A[maxn],B[maxn];
int dp[maxn][maxn],len1,len2;

void path()
{
	int tmp, i = len1, j = len2;
	int step = 0;
	while(i >= 1 || j >= 1)
	{
		if(A[i-1] == B[j-1]) tmp = 0;
		else tmp = 1;
		if(dp[i][j] == dp[i-1][j-1] + tmp && i >= 1 && j >= 1)
		{
			if(tmp)
				printf("%d Replace %d,%c\n",++step,i,B[j-1]);
			i--, j--;
		}
		else if(dp[i][j] == dp[i-1][j] + 1 && i >= 1)
		{
			printf("%d Delete %d\n",++step,i);
			i--;
		}
		else if(dp[i][j] == dp[i][j-1] + 1 && j >= 1)
		{
			printf("%d Insert %d,%c\n",++step,i+1,B[j-1]);
			j--;
		}
	}
}

int main()
{
	while(scanf("%s %s",A,B)!=EOF)
	{
		getchar();
		len1 = strlen(A);
		len2 = strlen(B);
		memset(dp,0,sizeof(dp));
		for(int i = 0; i <= len1; i++)
			dp[i][0] = i;
		for(int i = 0; i <= len2; i++)
			dp[0][i] = i;
		for(int i = 1; i <= len1; i++)
			for(int j = 1; j <= len2; j++)
			{
				int tmp = min(dp[i][j-1],dp[i-1][j]) + 1;
				int d = A[i-1] == B[j-1] ? 0 : 1;
				dp[i][j] = min(tmp,dp[i-1][j-1]+d);
			}
		printf("%d\n",dp[len1][len2]);
		path();
	}
	return 0;
}


你可能感兴趣的:(dp)