poj1159 dp + 滚动数组

题目链接: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\n", len - dp[len % 2][len]);
44     }
45     return 0;
46 }

 

posted @ 2016-04-25 22:30  海无泪  阅读(200)  评论(0编辑  收藏  举报