题目连接:10739 - String to Palindrome
题目大意:给出一个字符串, 通过增加, 删除或替换一个字符, 使得该字符串变成一个回文串, 要求操作最少, 输出最小的操作步数。
解题思路:对于每个区间[i, j]:
1、str[i] == str[j], dp[i][j] = dp[i + 1][j - 1];
2、 str[i] != str[j], dp[i][j] = min(dp[i + 1][j], dp[i] [j - 1], dp[i + 1] [j - 1]) + 1 (分别对应三个操作方式)
#include <stdio.h>
#include <string.h>
const int N = 1005;
int min(int a, int b) { return a < b ? a : b; }
int len, dp[N][N];
char str[N];
void solve() {
len = strlen(str);
memset(dp, 0, sizeof(dp));
for (int i = len - 1; i >= 0; i--) {
for (int j = i + 1; j < len; j++) {
if (str[i] == str[j])
dp[i][j] = dp[i + 1][j - 1];
else
dp[i][j] = min( min(dp[i + 1][j], dp[i][j - 1]), dp[i + 1][j - 1]) + 1;
}
}
}
int main() {
int cas, t = 1;
scanf("%d", &cas);
while (cas--) {
scanf("%s", str);
solve();
printf("Case %d: %d\n", t++, dp[0][len - 1]);
}
return 0;
}