题意:
给出一个字符串,有三种操作(任意位置删除、增加、替换一个字符),问需要最少的操作次数使其变为回文串。
思路:
dp[i][j]表示区间 i*到 *j,将其变成回文串的最少操作次数。
如果a[i]==a[j],dp[i][j]=dp[i+1][j-1],
否则dp[i][j]=min(dp[i+1][j-1],min(dp[i+1][j],dp[i][j-1]))+1
**增加和删除一样:(dp[i+1][j],dp[i][j-1])
替换:dp[i+1][j-1]**
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
char a[1005];
int dp[1005][1005];
int main()
{
ios::sync_with_stdio(false);
int T;
scanf("%d",&T);
for(int k=1;k<=T;k++)
{
memset(dp,0,sizeof(dp));
scanf("%s",a);
int len=strlen(a);
for(int i=len-1;i>=0;i--)
{
for(int j=i+1;j<len;j++)
{
if(a[i]==a[j])
{
dp[i][j]=dp[i+1][j-1];
}
else
{
dp[i][j]=min(dp[i+1][j-1],min(dp[i+1][j],dp[i][j-1]))+1;
}
}
}
printf("Case %d: %d\n",k,dp[0][len-1]);
}
return 0;
}