您的位置:首页 > 其它

POJ-1159 Palindrome (dp+滚动数组节省内存)

2016-08-18 10:32 211 查看
题目链接:点击打开链接

题意:

    这道题是说 给你一个字符串, 让你求最少添加多少个新字符,可以使该字符串变成回文串。

思路:

    本题关键要了解的一点就是, 最少要添加的字符数 = 该字符串的长度 - 该字符串的逆序与该字符串的最长公共子序列。

    剩下的就是求最长公共子序列问题了,本来是道很基础的题目,但又有新的问题就是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]
<< endl;
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: