题意:一个长为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)的更多相关文章

  1. POJ 1159 Palindrome(字符串变回文:LCS)

    POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...

  2. POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Desc ...

  3. HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)

    题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数. 析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串, 那么最后正反都得是一样的,所以我们就正反求 ...

  4. POJ 1159 - Palindrome (LCS, 滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 55018   Accepted: 19024 Desc ...

  5. LCS(滚动数组) POJ 1159 Palindrome

    题目传送门 题意:一个字符串要变成回文串至少要插入多少个字符 分析:LCS,长度 - 原串和反串的最大相同长度就是要插入的个数.解释一下,当和反串相同时,在原串中已经是回文的部分了,那么减去LCS长度 ...

  6. 动态规划+滚动数组 -- POJ 1159 Palindrome

    给一字符串,问最少加几个字符能够让它成为回文串. 比方 Ab3bd 最少须要两个字符能够成为回文串 dAb3bAd 思路: 动态规划 DP[i][j] 意味着从 i 到 j 这段字符变为回文串最少要几 ...

  7. POJ 1159 Palindrome(LCS)

    题目链接:http://poj.org/problem?id=1159 题目大意:给定一串字符,添加最少的字符,使之成为回文串. Sample Input 5 Ab3bd Sample Output ...

  8. POJ 1159 Palindrome(最长公共子序列)

    Palindrome [题目链接]Palindrome [题目类型]最长公共子序列 &题解: 你做的操作只能是插入字符,但是你要使最后palindrome,插入了之后就相当于抵消了,所以就和在 ...

  9. poj 1159 Palindrome 【LCS】

    任意门:http://poj.org/problem?id=1159 解题思路: LCS + 滚动数组 AC code: #include <cstdio> #include <io ...

随机推荐

  1. 转载【H:JL】用大家的力量来总结一个目录(众人拾柴火焰高)

    博客地址:http://www.cnblogs.com/HJL-Blog/p/4459245.html

  2. WPF下DataGrid的简单应用

    Dim dt As New DataTable() '------------------- dt.Columns.Add(New DataColumn("名称")) dt.Col ...

  3. ansible upload

    # 链接地址:https://www.cnblogs.com/xiaoxiaoleo/p/6626299.html # synchronize: 从拉取远程服务器文件,需要加mode: pull # ...

  4. 5个对话框和FileStream:文件流

    1.private void button1_Click(object sender, EventArgs e) { colorDialog1.ShowDialog();//显示颜色选择器 panel ...

  5. ridis 集群配置

    ./redis-cli -h 192.168.106.128 -p  6379 redis 1.ping 2.set str1 abc    get str1 3.  mkdir ../redis-c ...

  6. JAVA基本数据类型转换的注意事项

    JAVA中基本数据类型: 类型: 字节: 范围: 默认值: byte 1 -128~127 0 short 2 -32768~32767 0 char 2 0~65535 '\u0000' int 4 ...

  7. **PCD数据获取:Kinect+OpenNI+PCL对接(代码)

    前言: PCL使用点云作为数据格式,Kinect可以直接作为三维图像的数据源产生三维数据,其中的桥梁是OpenNI和PrimeSense.为了方便地使用Kinect的数据,还是把OpenNI获取的基础 ...

  8. 【JavaScript框架封装】实现一个类似于JQuery的属性框架的封装

    // 属性框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 获取/设置某一个元素 ...

  9. [SCOI2016]萌萌哒(倍增+并查集)

    当区间\([a,b]\)和\([c,d]\)对应相等时. 我们把两个区间对应位置上的数所在并查集合并. 最后并查集的数量为\(num\)答案就是\(9*10^num\)因为是个数,不能有前置\(0\) ...

  10. [网络流24题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)

    洛谷传送门 LOJ传送门 和太空飞行计划问题一样,这依然是一道最大权闭合图问题 “骑士共存问题”是“方格取数问题”的弱化版,本题解不再赘述“骑士共存问题”的做法 分析题目,如果我们能把所有方格的数都给 ...