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;
}
题意:
这道题是说 给你一个字符串, 让你求最少添加多少个新字符,可以使该字符串变成回文串。
思路:
本题关键要了解的一点就是, 最少要添加的字符数 = 该字符串的长度 - 该字符串的逆序与该字符串的最长公共子序列。
剩下的就是求最长公共子序列问题了,本来是道很基础的题目,但又有新的问题就是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;
}
相关文章推荐
- POJ1159——Palindrome——DP+滚动数组(节省空间)
- poj 1159 Palindrome(dp+滚动数组)
- POJ 1159-Palindrome(dp_回文串+滚动数组)
- poj 1159 Palindrome ( dp 滚动数组 )
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
- [POJ1159]Palindrome(dp,滚动数组)
- poj 1159 Palindrome (DP:LCS+滚动数组)
- poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)
- poj - 1159 - Palindrome(滚动数组dp)
- POJ 1159 Palindrome (滚动数组 DP)
- POJ1159 Palindrome(滚动数组DP)
- poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)
- dp中滚动数组的应用:01背包、POJ 1159 Palindrome、多段图路径问题
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
- poj 1159 Palindrome (lcs,滚动数组)
- poj-1159-Palindrome-学习滚动数组
- POJ 1159 Palindrome(滚动数组)
- 动态规划+滚动数组 -- POJ 1159 Palindrome
- 滚动数组 poj1159 Palindrome
- POJ 1159 - Palindrome (LCS, 滚动数组)