poj 1159 Palindrome

来源:互联网 发布:大恒视觉软件 编辑:程序博客网 时间:2024/06/16 00:19

题目链接 poj 1159 Palindrome

题意很简单,给你一个字符串,求最少要添加多少个字符串使它变成回文串。

原本是区间dp的题目,但是这里用到了一个小技巧,这个字符与其的逆序字符串的最长公共子序列其实就是这其中最长的回文串,只要n再减去这个最长公共子序列长度就是所求答案了,这里求最长公共子序列长度,dp[5000][5000]会mle所以需要优化一下空间,用滚动数组记录一下就可以了。
Java版:

import java.util.*;import java.math.*;import java.text.*;import java.lang.*;import java.io.*;public class Main{    public static void main(String[] args){        Scanner cin = new Scanner(new BufferedInputStream(System.in));        while (cin.hasNext()){            int n = cin.nextInt();            String p = cin.nextLine();            String ss = cin.nextLine();            char[] s1 = new char[5010];            char[] s2 = new char[5010];            s1 = ss.toCharArray();            for (int i = 0; i < n; i++) {                s2[i] = s1[n - 1 - i];            }            int[][] dp = new int[2][n + 1];            for (int i = n - 1; i >= 0; i--) {                for (int j = n - 1; j >= 0; j--) {                    if (s1[i] == s2[j]) {                        dp[i % 2][j] = dp[(i + 1) % 2][j + 1] + 1;                    }                    else{                        dp[i % 2][j] = Math.max(dp[(i + 1) % 2][j], dp[i % 2][j + 1]);                    }                }            }            System.out.println(n - dp[0][0]);        }    }}

C++版:

#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cstring>#include <cmath>using namespace std;int dp[2][5010];char s1[5010];char s2[5010];int main(){    int n;    while(cin >> n)    {        getchar();        scanf("%s", s1);        memset(dp, 0, sizeof(dp));        for (int i = 0; i < n; ++i)        {            s2[i] = s1[n - 1 - i];        }        int x = strlen(s1);        for (int i = x - 1; i >= 0; --i)        {            for (int j = x - 1; j >= 0; --j)            {                if (s1[i] == s2[j])                {                    dp[i % 2][j] = dp[(i + 1) % 2][j + 1] + 1;                }                else                {                    dp[i % 2][j] = max(dp[(i + 1) % 2][j], dp[i % 2][j + 1]);                }            }        }        printf("%d\n", n - dp[0][0]);    }}
0 0
原创粉丝点击