uva 10739 String to Palindrome(dp)

来源:互联网 发布:北邮软件下载 编辑:程序博客网 时间:2024/05/16 19:13

题目连接: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];    elsedp[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;}