POJ 1159 (转换为求LCS)

来源:互联网 发布:linux mint 内核版本 编辑:程序博客网 时间:2024/05/17 23:05

题意:给定一个字符串,任意位置添加字母形成回文字串,最少添加几个字母.

思路:把字符串反转,求反转串和原串的最长公共子序列,ans=n-lcs

代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAX_N = 5005;char s[MAX_N], t[MAX_N];int dp[3][MAX_N + 1];int main(){    int n;    while(cin >> n) {        cin >> s;        memset(dp, 0, sizeof(dp));        for (int i = n - 1, j = 0; i >= 0; --i) {            t[i] = s[j++];        }        int e = 0;        for(int i = 0; i < n; ++i) {            e = 1 - e;            for(int j = 0; j < n; ++j) {                if(s[i] == t[j]) {                    dp[e][j + 1] = dp[1 - e][j] + 1;                } else {                    dp[e][j + 1] = max(dp[1 - e][j + 1], dp[e][j]);                }            }        }        cout << n - dp[e][n] << endl;    }    return 0;}


0 0
原创粉丝点击