您的位置:首页 > 其它

UVA - 10739 String to Palindrome

2015-03-15 23:51 357 查看
题目大意:给出一个字符串, 通过增加, 删除或替换一个字符, 使得该字符串变成一个回文串, 要求操作最少, 输出最小的操作步数。

解题思路:对于每个区间[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: