Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 52571 | Accepted: 18124 |
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2题意:给定一个串,求最小加入几个字符能使其变成回文串。
题解:找出原串的逆串,再求n - LCS即得结果,原理是原串和逆串构成的公共序列必定是回文的,所以,对于那些不能匹配成回文的字符只需要在它与回文串中心对称的位置加上一个同样的字符即构成回文。
#include <stdio.h> #include <string.h> #define maxn 5002 char str1[maxn], str2[maxn]; short dp[maxn][maxn]; void getTraverse(int len) { int i = 1; while(len) str2[i++] = str1[len--]; str2[i] = '\0'; } int max(short a, short b){ return a > b ? a : b; } int LCS(int len) { int i, j; memset(dp, 0, sizeof(dp)); for(i = 1; i <= len; ++i){ for(j = 1; j <= len; ++j) if(str1[i] == str2[j]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = max(dp[i-1][j], dp[i][j-1]); } return dp[len][len]; } int main() { int n, len; while(scanf("%d", &n) == 1){ scanf("%s", str1 + 1); len = strlen(str1 + 1); getTraverse(len); printf("%d\n", len - LCS(len)); } return 0; }
POJ1159 Palindrome 【动态规划】,布布扣,bubuko.com
原文:http://blog.csdn.net/chang_mu/article/details/38389317