题意是说,给定一个字符串,问至少还需要插入多少个字符才能使得该字符串成为回文字符串。

这道题一开始做的时候用了一个简单的动态规划,开了一个5000*5000的数组,用递归形式实现,代码如下:

其中d[i][j]表示i到j所需要插入的字符数。然而数组开得太大直接报MLE。因此想到用滚动数组来解决。

MLE代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
//内存超限 MLE
const short maxn=+;
int d[maxn][maxn];//d表示i到j形成回文串所需加入的字符数
string s;
int dp(int i,int j){
if(d[i][j]>=)return d[i][j];
if(i<j){
if(s[i]==s[j]){
d[i][j]=dp(i+,j-);
return d[i][j];
}
else{
d[i][j]=min(dp(i+,j),dp(i,j-))+;
return d[i][j];
}
}
else if(i==j){
d[i][j]=;
return ;
}
}
int main(void){
int n;
scanf("%d",&n);
cin>>s;
memset(d,-,sizeof(d));
int ans=dp(,n-);
cout<<ans<<endl;
return ;
}

使用滚动数组的动态规划和上述略有不同。基本算法如下:

设输入为X,则记X的逆序列为Y,其中X的字符个数为n,

那么ans=n-(X和Y的最大公共子序列长度)。这样就将该问题转化为了求最长公共子序列的问题。

则此时令d[i][j]表示为X序列和Y序列在前I项和前j项的最大公共序列的长度。

具体状态转移方程见代码或最长公共子序列题的动态转移方程。

但此时的d[i][j]仍然是5000*5000的数组,而由状态转移方程可以发现,在递推过程中其实只涉及两层数组内容,因此可以只保留两层数组从而将数组减小为2*5000的滚动数组。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
//线性动态规划,滚动数组
const int maxn=+;
int d[][maxn];
int main(void){
int n;
while(cin>>n){
string s1,s2;
cin>>s1;
s2=s1;
reverse(s1.begin(),s1.end());
memset(d,,sizeof(d));
int n=s1.length();
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(s1[i-]==s2[j-]){
d[i%][j]=d[(i-)%][j-]+;
}
else{
d[i%][j]=max(d[(i-)%][j],d[i%][(j-)]);
}
}
}
cout<<n-d[n%][n]<<endl;
}
return ;
}

POJ_1159 Palindrome (线性动态规划+滚动数组)的更多相关文章

  1. 2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组)

    2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组) https://www.luogu.com.cn/problem/P2516 题意: 给定字符串 \(S\) ...

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

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

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

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

  4. hdoj 1513 Palindrome【LCS+滚动数组】

    Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

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

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

  6. UVa 1625 - Color Length(线性DP + 滚动数组)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. hdu 1513 Palindrome【LCS滚动数组】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1513 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  8. HDU-1024 Max Sum Plus Plus 动态规划 滚动数组和转移优化

    题目链接:https://cn.vjudge.net/problem/HDU-1024 题意 给n, m和一个序列,找m个不重叠子串,使这几个子串内元素和的和最大. n<=1e6 例:1 3 1 ...

  9. [tyvj 1061] Mobile Service (线性dp 滚动数组)

    3月15日第一题! 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须 ...

随机推荐

  1. R语言中的Apriori关联规则的使用

    1.下载Matrix和arules包 install.packages(c("Matrix","arules")) 2.载入引入Matrix和arules包 # ...

  2. Eclipse+ADT+Android SDK 搭建安卓开发环境(版权属于forever-z)

    运行环境 windows 7或者10(64位); 为例eclipse-jee-neon-3-win32-x86_64: ADT-23.0.4 下载地址 安装JDK 这里可以参考关于安装JDK的教程,请 ...

  3. 1.引入jQuery

    http://libs.baidu.com/jquery/2.1.4/jquery.js

  4. Spring Cloud Zuul与网关中间件

    Spring Cloud Zuul与网关中间件_网易订阅 http://dy.163.com/v2/article/detail/DC7L8UV10511HSJK.html

  5. glibc-2.23_malloc_consolidate_浅析

  6. MapReduce小文件优化与分区

    一.小文件优化 1.Mapper类 package com.css.combine; import java.io.IOException; import org.apache.hadoop.io.I ...

  7. Android 查看自己的keystore的别名及相关信息

    1.在DOS窗口下进入自己的keystore所在位置,输入 keytool -list  -v -keystore xxxx.keystore -storepass 密码 xxxx.keystore是 ...

  8. CentOS7安装MySQL 5.7

    1.源码包下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.20.tar.gz 2.编译安装 安装依赖包: y ...

  9. django组件之ContentType

    ContentTyep组件: 帮助我们关联所有数据库的表 帮助我们反向查询关联数据表中的所有策略信息 GenericForeignkey(帮助我们快速插入数据) GenericRelation(用于反 ...

  10. http://echarts.baidu.com/demo.html#effectScatter-map

    http://echarts.baidu.com/demo.html#effectScatter-map