poj - 1159 - Palindrome(滚动数组dp)
题意:一个长为N的字符串( 3 <= N <= 5000)。问最少插入多少个字符使其变成回文串。
题目链接:http://poj.org/problem?id=1159
——>>状态:dp[i][j]表示第i个字符到第j个字符组成的字符串变成回文串的最少插入次数。
状态转移方程:
若sz[i] == sz[j]。则:dp[i][j] = dp[i + 1][j - 1];
否则:dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1;
提交,5000 * 5000的int ——> 5000 * 5000 * 4 bytes 约(/ (2 ^ 20))等于5 * 5 * 4 MB = 100 MB > 65536 K = 64 M,会MLE的。
。
假设开成short。约 50M < 64M。能够了喔。不错!
更好的办法,用滚动数组的思想优化。。
#include <cstdio>
#include <algorithm> using std::min; const int MAXN = 5000 + 1; char sz[MAXN];
int dp[2][MAXN]; void Dp(int N)
{
int nState = 0;
for (int i = N - 1; i >= 0; --i)
{
dp[1 ^ nState][i] = 0;
for (int j = i + 1; j < N; ++j)
{
if (sz[i] == sz[j])
{
dp[1 ^ nState][j] = dp[nState][j - 1];
}
else
{
dp[1 ^ nState][j] = min(dp[nState][j], dp[1 ^ nState][j - 1]) + 1;
}
}
nState ^= 1;
} printf("%d\n", dp[nState][N - 1]);
} int main()
{
int N; while (scanf("%d", &N) == 1)
{
scanf("%s", sz);
Dp(N);
} return 0;
}
开short来AC的写法:
#include <cstdio>
#include <algorithm> using std::min; const int MAXN = 5000 + 1; char sz[MAXN];
short dp[MAXN][MAXN]; void Dp(int N)
{
for (int i = 0; i < N; ++i)
{
dp[i][i] = 0;
if (i + 1 < N)
{
if (sz[i] == sz[i + 1])
{
dp[i][i + 1] = 0;
}
else
{
dp[i][i + 1] = 1;
}
}
}
for (int nLen = 3; nLen <= N; ++nLen)
{
for (int i = 0; i < N; ++i)
{
int j = i + nLen - 1;
if (j >= N) break;
if (sz[i] == sz[j])
{
dp[i][j] = dp[i + 1][j - 1];
}
else
{
dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1;
}
}
}
} void Output(int N)
{
printf("%d\n", dp[0][N - 1]);
} int main()
{
int N; while (scanf("%d", &N) == 1)
{
scanf("%s", sz);
Dp(N);
Output(N);
} return 0;
}
poj - 1159 - Palindrome(滚动数组dp)的更多相关文章
- POJ 1159 Palindrome(字符串变回文:LCS)
POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 56150 Accepted: 19398 Desc ...
- HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)
题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数. 析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串, 那么最后正反都得是一样的,所以我们就正反求 ...
- POJ 1159 - Palindrome (LCS, 滚动数组)
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 55018 Accepted: 19024 Desc ...
- LCS(滚动数组) POJ 1159 Palindrome
题目传送门 题意:一个字符串要变成回文串至少要插入多少个字符 分析:LCS,长度 - 原串和反串的最大相同长度就是要插入的个数.解释一下,当和反串相同时,在原串中已经是回文的部分了,那么减去LCS长度 ...
- 动态规划+滚动数组 -- POJ 1159 Palindrome
给一字符串,问最少加几个字符能够让它成为回文串. 比方 Ab3bd 最少须要两个字符能够成为回文串 dAb3bAd 思路: 动态规划 DP[i][j] 意味着从 i 到 j 这段字符变为回文串最少要几 ...
- POJ 1159 Palindrome(LCS)
题目链接:http://poj.org/problem?id=1159 题目大意:给定一串字符,添加最少的字符,使之成为回文串. Sample Input 5 Ab3bd Sample Output ...
- POJ 1159 Palindrome(最长公共子序列)
Palindrome [题目链接]Palindrome [题目类型]最长公共子序列 &题解: 你做的操作只能是插入字符,但是你要使最后palindrome,插入了之后就相当于抵消了,所以就和在 ...
- poj 1159 Palindrome 【LCS】
任意门:http://poj.org/problem?id=1159 解题思路: LCS + 滚动数组 AC code: #include <cstdio> #include <io ...
随机推荐
- Python金融量化
Python股票数据分析 最近在学习基于python的股票数据分析,其中主要用到了tushare和seaborn.tushare是一款财经类数据接口包,国内的股票数据还是比较全的 官网地址:http: ...
- BZOJ 1531 二进制优化多重背包
思路: 讲道理我应该写单调队列优化多重背包的 但是我不会啊 但是我现在! 还不会啊 我就写了个二进制优化的.. 过了 //By SiriusRen #include <cstdio> #i ...
- LeetCode Weekly Contest 19
1.504. Base 7 水题,直接写.但是我错了一次,忘了处理0的情况. 没有考虑边界条件.写完代码,一般需要自己想几个边界测试用例进行测试. class Solution { public: s ...
- 读书笔记7-浪潮之巅(part2)
浪潮之巅 ——成功的公司各有各的绝招,而失败的公司倒有不少的共同之处 奔腾的芯(Intel) 前身:在处理器性能还很平庸的年代,站在科技前沿的计算机公司都是集中在工作站级处理器领域的,而同IBM.DE ...
- mac 下安装 mariadb
通过brew 安装: brew install mariadb 初始化数据库 cd /usr/local/Cellar/mariadb/10.0.10/scripts mysql_install_db ...
- 项目随笔之springmvc中freemark如何获取项目路径
转载:http://blog.csdn.net/whatlookingfor/article/details/51538995 在SpringMVC框架中使用Freemarker试图时,要获取根路径的 ...
- chrome模拟微信
这里有一个模拟器,既可以设置模拟很多型号的手机设备,也可以伪造你想要的HTTP_USER_AGENT.选择USER_AGENT,选other,微信的HTTP_USER_AGENT是: 在iPhone下 ...
- sqlserver重组索引,优化碎片
dbcc dbreindex('digitlab.dbo.RequestForm','',90) dbcc dbreindex('digitlab.dbo.Requestitem','',90) db ...
- xshell登录centos7很慢解决办法
使用xshell登录到centos系统虚拟机,可以登录上去,但是认证速度特别慢. 因为在登录时,需要反向解析dns,因此,修改linux配置文件,vi /etc/ssh/sshd_config,将其注 ...
- java 常用API 时间 练习
package com.orcal.demc01; import java.util.Date; public class Xuexi { public static void main(String ...