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

题目链接:点击打开链接

题意:

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

思路:

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

    剩下的就是求最长公共子序列问题了,本来是道很基础的题目,但又有新的问题就是dp[5000][5000]的静态数组占用内存太大了,会MLE。这里采取的办法是求余滚动数组,把数组压缩到2*5000大小。

    详情请看代码:

    ps:据说用short也能过。

代码:

// poj-1159 Palindrome(dp).cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 
#include 
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;
}


你可能感兴趣的:(poj,初级算法)