UVA - 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 <cstdio>
#include <cstring>

char s[1050];
int DP[1050][1050];

int DPS(int x, int y) {
	if (DP[x][y] != -1)
		return DP[x][y];
	if (x == y || x == y + 1)
		return DP[x][y] = 0;
	if (s[x] == s[y])
		return DP[x][y] = DPS(x + 1, y - 1);
	int k = DPS(x + 1, y);
	if (k > DPS(x, y - 1))
		k = DPS(x, y - 1);
	if (k > DPS(x + 1, y - 1))
		k = DPS(x + 1, y - 1);
	return DP[x][y] = k + 1;
}

int main() {
	int T, cnt = 0;
	scanf("%d\n", &T);
	while (T--) {
		scanf("%s", s);
		memset(DP, -1, sizeof(DP));
		printf("Case %d: %d\n", ++cnt, DPS(0, strlen(s)-1));
	}
	return 0;
}


你可能感兴趣的:(UVA - 10739 String to Palindrome)