POJ_1159 Palindrome (线性动态规划+滚动数组)
题意是说,给定一个字符串,问至少还需要插入多少个字符才能使得该字符串成为回文字符串。
这道题一开始做的时候用了一个简单的动态规划,开了一个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 (线性动态规划+滚动数组)的更多相关文章
- 2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组)
2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组) https://www.luogu.com.cn/problem/P2516 题意: 给定字符串 \(S\) ...
- 动态规划+滚动数组 -- POJ 1159 Palindrome
给一字符串,问最少加几个字符能够让它成为回文串. 比方 Ab3bd 最少须要两个字符能够成为回文串 dAb3bAd 思路: 动态规划 DP[i][j] 意味着从 i 到 j 这段字符变为回文串最少要几 ...
- POJ 1159 - Palindrome (LCS, 滚动数组)
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 55018 Accepted: 19024 Desc ...
- hdoj 1513 Palindrome【LCS+滚动数组】
Palindrome Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)
题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数. 析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串, 那么最后正反都得是一样的,所以我们就正反求 ...
- UVa 1625 - Color Length(线性DP + 滚动数组)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- hdu 1513 Palindrome【LCS滚动数组】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1513 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU-1024 Max Sum Plus Plus 动态规划 滚动数组和转移优化
题目链接:https://cn.vjudge.net/problem/HDU-1024 题意 给n, m和一个序列,找m个不重叠子串,使这几个子串内元素和的和最大. n<=1e6 例:1 3 1 ...
- [tyvj 1061] Mobile Service (线性dp 滚动数组)
3月15日第一题! 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须 ...
随机推荐
- 查看执行计划plustrace:set autotrace trace exp stat(SP2-0618、SP2-0611)
执行计划是SQL获取和处理数据的途径和方法. 执行计划和性能 SQL -- 数据库性能的始作俑者 所有的数据库性能,几乎全部来自SQL. 优秀的SQL是数据库最大的福祉. 一条很烂的SQL,可以搞瘫一 ...
- Python面象对象与类
# -*- coding: utf-8 -*- # @Date: 2017-08-26 # @Original: from collections import namedtuple from col ...
- 100个常用的linux命令(转)
原文:http://blogread.cn/it/article/6368?f=wb 1,echo “aa” > test.txt 和 echo “bb” >> test.txt / ...
- windows通过ssh连接虚拟机中的ubuntu步骤
linux端开启ssh服务 1.安装openssh-server包 sudo apt-get install openssh-server 2.启动ssh server sudo /etc/init. ...
- SpringMVC的@RequestParam
以前写controller层的时候都是默认带上 @RequestParam 的, 今天发现不加@RequestParam 也能接收到参数 下面我们来区分一下加与不加的区别 这里有两种写法 @Reque ...
- nginx的相关信息
Nginx安装 nginx官网:https://nginx.org/ 安装准备:nginx依赖pcre库,要先安装pcre(nginx在rewrite时需要解析正则,PCRE是正则解析库) yum i ...
- PAT 1037 Magic Coupon[dp]
1037 Magic Coupon(25 分) The magic shop in Mars is offering some magic coupons. Each coupon has an in ...
- Flask form(登录,注册)
用户登录 from flask import Flask, render_template, request, redirect from wtforms import Form from wtfor ...
- [笔记]Delphi 2007写DLL供VC调用实例
考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...
- 某个php爬虫程序分析--来自wooyun
乌云漏洞编号: WooYun-2014-68061 作者:hkAssassin 爬虫程序源码: <?php header("content-type:text/html;charset ...