题目链接:http://poj.org/problem?id=1159
题目大意:给你一个字符串, 求插入最小的字符个数使字符串变成回文串。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cstdlib> 6 #include <cmath> 7 #include <set> 8 #include <map> 9 #include <vector> 10 #define LL long long 11 using namespace std; 12 13 int dp[2][5010]; 14 int max(int a, int b) 15 { 16 return a > b ? a : b; 17 } 18 int main() 19 { 20 int n, i, j; 21 char s1[5010], s2[5010]; 22 while(~scanf("%d", &n)) 23 { 24 scanf("%s", s1 + 1); 25 int len = strlen(s1 + 1); 26 j = 1; 27 for(i = len; i > 0; i--) 28 s2[j++] = s1[i]; 29 for(i = 0; i <= len; i++) 30 dp[0][i] = 0; 31 dp[1][0] = 0; 32 for(i = 1; i <= len; i++) 33 { 34 for(j = 1; j <= len; j++) 35 { 36 dp[i % 2][j] = max(dp[(i - 1) % 2][j], dp[i % 2][j - 1]); 37 if(s1[i] == s2[j]) 38 dp[i % 2][j] = max(dp[(i - 1) % 2][j - 1] + 1, dp[i % 2][j]); 39 //cout << dp[i % 2][j] << " "; 40 } 41 //cout <<endl; 42 } 43 printf("%d ", len - dp[len % 2][len]); 44 } 45 return 0; 46 }