poj 1159 Palindrome(区间dp)
题目链接:http://poj.org/problem?id=1159
思路分析:对该问题的最优子结构与最长回文子序列相同。根据最长回文子序列的状态方程稍加改变就可以得到该问题动态方程。
假设字符串为A[0, 1, ..., n],则定义状态dp[i, j]表示字符串A[i, i+1, ..., j]成为回文字符串所需要插入的最少字符数,则当A[i] == A[j+1]时,
dp[i,j] = dp[i+1, j-1],否则dp[i, j] = Min(dp[i+1, j], dp[i, j+1]);
代码如下:
#include <stdio.h> #include <string.h> const int MAX_N = 5000 + 10; short dp[MAX_N][MAX_N]; char A[MAX_N]; inline int Min(int a, int b) { return a > b ? b : a; } int Solve(int i, int j) { if (dp[i][j] != -1) return dp[i][j]; if (i == j) return dp[i][j] = 0; else if (i > j) return dp[i][j] = 0; else if (A[i] == A[j]) return dp[i][j] = Solve(i + 1, j - 1); else return dp[i][j] = 1 + Min(Solve(i + 1, j), Solve(i, j - 1)); } int main() { int n, ans; while(scanf("%d %s", &n, A) != EOF) { memset(dp, -1, sizeof(dp)); ans = Solve(0, n - 1); printf("%d\n", ans); } return 0; }