poj1159 dp(滚动数组优化)
Crawling in process... Crawling failed Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.
Input
Output
Sample Input
5
Ab3bd
Sample Output
2
题目大意:给你一个字符串,让你往其中插入字符,使其变成回文字符串,问最少需要插入多少字符。
思路分析:所谓回文字符串,就是正读和倒读一样的,因此可以考虑构造两个字符串,另一个字符串是
原字符串的逆序串,然后求最长公共子序列长度,那么字符串长度减去最长公共字符串长度就是需要插入
的字符数,注意dp数组开short,否则会爆内存。
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
const int maxn=5000+100;
short dp[maxn][maxn];
int main()
{
int n;
char s1[maxn],s2[maxn];
scanf("%d",&n);
cin>>s1;
for(int i=n-1;i>=0;i--)
s2[n-i-1]=s1[i];
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(s1[i]==s2[j])
{
if(i>=1&&j>=1)
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=1;
}
if(s1[i]!=s2[j])
{
if(i==0&&j==0) dp[0][0]=0;
else if(i>=1&&j==0) dp[i][j]=dp[i-1][j];
else if(i==0&&j>=1) dp[i][j]=dp[i][j-1];
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<(n-dp[n-1][n-1])<<endl;
return 0;
}
优化:如果开数组dp[maxn][maxn],非常耗内存,如果不用short开就会MLE.但是我们注意到,
dp[i][j]只与上一层的dp[i-1][j-1]或dp[i-1][j]有关,因此可以采用就地滚动的方法节省
内存,只需要开一个dp[2][maxn]的数组,同时,字符串在储存的时候也有技巧,推荐从1-n储存,
这样dp边界处理起来就容易的多。
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
const int maxn=5000+100;
const int inf=0xfffffff;
short dp[2][maxn];//滚动数组
int main()
{
int n;
char s1[maxn],s2[maxn];
scanf("%d",&n);
scanf("%s",s1+1);
for(int i=n;i>=1;i--)
s2[n-i+1]=s1[i];
memset(dp,0,sizeof(dp));
int ma=-inf;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(s1[i]==s2[j])
{
dp[i%2][j]=dp[(i-1)%2][j-1]+1;
}
if(s1[i]!=s2[j])
{
dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]);
}
if(dp[i%2][j]>ma) ma=dp[i%2][j];
}
}
cout<<(n-ma)<<endl;
return 0;
}
poj1159 dp(滚动数组优化)的更多相关文章
- HDU_1024.MaxSumPlusPlus(基础DP + 滚动数组优化讲解)
这道题打破了我常规的做题思路,因为这是我刚开始训练DP,感觉这道题目好晕眼呀,emm其实就是感觉自己是真的菜...... 为什么说打破了我的做题思路呢,因为我平时看题解都是在已经AC或者完全不懂的情况 ...
- [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
- LG3004 「USACO2010DEC」Treasure Chest 区间DP+滚动数组优化
问题描述 LG3004 题解 把拿走的过程反向,看做添加的过程,于是很显然的区间DP模型. 设\(opt_{i,j}\)代表区间\([i,j]\)中Bessie可以获得的最大值,显然有 \[opt_{ ...
- 51Nod 1084 矩阵取数问题 V2 双线程DP 滚动数组优化
基准时间限制:2 秒 空间限制:131072 KB 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上.第1遍时只能向下和向右走,第2遍时只能向 ...
- 2014年北京 happy matt friends(dp + 滚动数组优化)
Happy Matt Friends Time Limit: 6000/6000 MS (Java/Others) Memory Limit: 510000/510000 K (Java/Oth ...
- POJ 3666 Making the Grade (DP滚动数组)
题意:农夫约翰想修一条尽量平缓的路,路的每一段海拔是A[i],修理后是B[i],花费|A[i] – B[i]|,求最小花费.(数据有问题,代码只是单调递增的情况) #include <stdio ...
- Codeforces 712 D. Memory and Scores (DP+滚动数组+前缀和优化)
题目链接:http://codeforces.com/contest/712/problem/D A初始有一个分数a,B初始有一个分数b,有t轮比赛,每次比赛都可以取[-k, k]之间的数,问你最后A ...
- dp,滚动数组优化
51Nod1084矩阵取数问题 V2 题意: 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上.第1遍时只能向下和向右走,第2遍时只能向上和向左 ...
- hdu 3392(滚动数组优化dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3392 Pie Time Limit: 6000/3000 MS (Java/Others) Me ...
随机推荐
- CentOS7配置Apache HTTP Server
操作系统:Centos7 #关闭防火墙systemctl stop firewalld.service #禁止防火墙开机启动systemctl disable firewalld.service #安 ...
- CSS特殊性
样式的优先级取决于特殊性,特殊性为0,0,0,0 Ø每个元素或伪元素选择器贡献特殊性为 0,0,0,1 Ø每个类.伪类或者属性选择器的特殊性为 0,0,1,0 Ø每个ID选择器的特殊性为 0,1,0, ...
- 学习npm和gulp的一些资料,先记着明天接着学习
Unix命令行程序和内建指令(百度百科) 将less编译成css的gulp插件 淘宝cnpm镜像 gulp教程之gulp-less gulp入门指南 查找npm的package.json的name配置 ...
- 4月13日 php
用php打印乘法表: <html> <head> <title>我的第一个PHP页面</title> </head> <body> ...
- sql delete output
select * into #student1 from student select * from #student1 create table #temp2( id int not null,na ...
- dedecms 在php7.0无法安装
dedecms 需要mysql扩展的支持!而php7.0已废弃mysql扩展.所以我讲7.0改回了5.6然后就可以顺利安装了. 总结了一个经验:没有绝对实力,不要尝试新东西
- bzoj有趣的题目
你会发现bzoj上好多题AC率高的让人不敢想象 其实是因为数据没发,所以被n个人水过了-- 1142 1167 1351 1354 1359 1482 2812 3056 1469 我有特殊的减少代码 ...
- 符号表(Symbol Tables)
小时候我们都翻过词典,现在接触过电脑的人大多数都会用文字处理软件(例如微软的word,附带拼写检查).拼写检查本身也是一个词典,只不过容量比较小.现实生活中有许多词典的应用: 拼写检查 数据库管理应用 ...
- NetAnalyzer笔记 之 七 NetAnalyzer2016使用方法(1)
[创建时间:2016-04-17 14:47:00] NetAnalyzer下载地址 距离新本的NetAnalyzer已经发布一段时间了,因为比较忙期间只出了一个视频教程,一直没有来的急写文档,今天就 ...
- How to face setbacks
I’ve been in a bad mood since I started on the American Accent. I became even more upset when I adde ...