题目链接:点击打开链接
题意:
这道题是说 给你一个字符串, 让你求最少添加多少个新字符,可以使该字符串变成回文串。
思路:
本题关键要了解的一点就是, 最少要添加的字符数 = 该字符串的长度 - 该字符串的逆序与该字符串的最长公共子序列。
剩下的就是求最长公共子序列问题了,本来是道很基础的题目,但又有新的问题就是dp[5000][5000]的静态数组占用内存太大了,会MLE。这里采取的办法是求余滚动数组,把数组压缩到2*5000大小。
详情请看代码:
ps:据说用short也能过。
代码:
// poj-1159 Palindrome(dp).cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = 5001;
int dp[2][maxn];
char a[5001], b[5001];
int main()
{
int n;
while (cin >> n)
{
cin >> a;
int j = 0;
for (int i = n - 1; i >= 0; i--)
b[j++] = a[i];
for (int i = 0; i < n; i++)
dp[0][i] = 0;
dp[1][0] = 0;
for(int i = 1;i <= n;i++)
for (int j = 1; j <= n; j++)
{
if (a[i-1] == b[j-1])
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]);
}
cout << n - dp[n%2][n] << endl;
}
return 0;
}