这题就是算法书上的一个简单的DP题目。
题目大意:给定两个字符串:a,b
有三种改变方式:
1.加一个字符
2.删去一个字符
3.改变一个字符
每一个改变为一次操作,求出将a变为b的最小操作数
利用动态规划的思想解决。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 1006
#define inf 999999
char str_a[maxn];
char str_b[maxn];
int dp[maxn][maxn]; //dp[i][j]表示将a串的前i段转变成b串的前j段所需的费用
int len_a,len_b;
void init()
{
for(int i=1;i<=len_a;i++)
dp[i][0] = i;
for(int i=1;i<=len_b;i++)
dp[0][i] = i;
for(int i=1;i<=len_a;i++)
for(int j=1;j<=len_b;j++)
dp[i][j] = inf;
}
void DP_minsum(int i,int j)
{
//dp[i][j]动态转移有三种可能:
//1.dp[i-1][j-1]变化而来
//2.dp[i-1][j]变化而来
//3.dp[i][j-1]变化而来
//dp[i][j] = 1+min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])
int min = dp[i-1][j-1];
if(min > dp[i-1][j]) min = dp[i-1][j];
if(min > dp[i][j-1]) min = dp[i][j-1];
if(dp[i][j] > min + 1) dp[i][j] = min + 1;
}
int main()
{
while(~scanf("%d%d\n",&len_a,&len_b))
{
gets(str_a);
gets(str_b);
init();
for(int i=1;i<=len_a;i++)
{
for(int j=1;j<=len_b;j++)
{//因为数组是从0开始存储的,所以第i个位置是str[i-1]
if(str_a[i-1] == str_b[j-1])
{
dp[i][j] = dp[i-1][j-1];
}
else
{
DP_minsum(i,j);
}
}
}
printf("%d\n",dp[len_a][len_b]);
}
return 0;
}