hdu1513滚动数组
来源:互联网 发布:js 获取页面指定内容 编辑:程序博客网 时间:2024/05/19 15:23
相信很多同学都学过时间复杂度,在以前的很多程序编译里面我们也都看到过时间复杂度的优化,因为这个是一个很重要的因素,而且一般的ACM题目都是卡的时间,卡空间复杂度的不是很多,但是这里就卡了空间复杂度,这里我们介绍一种优化空间复杂度的方法——滚动数组。
下面首先介绍一下这个思想:滚动数组很适合用在二维DP而且是数组在很大时,可以节省内存,消除超内存的隐患!具体思想还是看了网上的资料,转载一个,共同享用吧!
滚动数组 举个简单的例子:
int i,d[100];
d[0]=1;d[1]=1;
for(i=2;i<100;i++)
d[i]=d[i-1]+d[i-2];
printf("%d",d[99]);
上面这个循环d[i]只需要解集中的前2个解d[i-1]和d[i-2];
为了节约空间用滚动数组的方法
int d[3];
d[0]=1;d[1]=1;
for(i=2;i<100;i++)
d[i%3]=d[(i-1)%3]+d[(i-2)%3];
printf("%d",d[99%3]);
注意上面的运算,我们只留了最近的3个解,数组好象在“滚动”一样,所以叫滚动数组
对于二维数组也可以用这种方法 例如:
int i,j,d[100][100];
for(i=1;i<100;i++)
for(j=0;j<100;j++)
d[i][j]=d[i-1][j]+d[i][j-1];
上?的d[i][j]忪便赖于d[i-1][j],d[i][j-1];
迿用滚动数组
int i,,j,d[2][100];
for(i=1;i<100;i++)
for(j=0;j<100;j++)
d[i%2][j]=d[(i-1)%2][j]+d[i%2][j-1];
滚动数组实际是一种节约空间的办法,时间上没什么优势,多用于DP中,举个例子先:
一个DP,平常如果需要1000×1000的空间,其实根据DP的特点,能以2×1000的空间解决问题,并且通过滚动,获得和1000×1000一样的效果。
下面开始讲这一题。
题目大意是:让你对给出的一个字符串插入几个字符然后让他变成回文字符串,并且插入的字符串最少,求出最少个数。还有一点就是插入少于两个的不算是回文,这里这么说但是实际是不对的,而且经过AC代码检测也不是这样的。
思路:主要有两个
1、他要求的是最少的,那么我们要求的是对于插入后的字符串而言,现在的字串是他的最大子序列,也就是两者的最大公共子序列是输入的字符串,那么这时候我们就将字符串a复制给b然后将a反制,求出a与b的最大公共子序列。在用给定的a长度减去最大公共子序列就行了。
2、既然要求的是回文的,我们将字符串a复制给b,再将b反制,然后b隔空插入a,如a=Ab3bd, b=db3bA,插入后a就是Adbb33bbdA,然后只需要减去针对重复的a的字符串删掉变成Adb3bdA,由这个长度减去a的长度就是答案,不过后来超了。
下面贴一个AC代码:
#include<iostream>
using namespace std;
#include<stdio.h>
#include<string.h>
#include<cstdlib>
int f[2][5005];
char a[5005],b[5005];
int main()
{
int i,j,k;
int N;
while(cin>>N)
{
scanf("%s",a+1);
memset(f,0,sizeof(f));
for(i=N,j=1;i>=1;i--,j++)
b[j]=a[i];
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(a[i]==b[j])
f[i%2][j]=f[(i-1)%2][j-1]+1;
else if(f[i%2][j-1]>f[(i-1)%2][j])
f[i%2][j]=f[i%2][j-1];
else
f[i%2][j]=f[(i-1)%2][j];
}
cout<<(N-f[N%2][N])<<endl;
}
}
- hdu1513滚动数组
- HDU1513(LCS+滚动数组)
- HDU1513 Palindrome(LCS+滚动数组)
- hdu1513&&poj 1159 Palindrome(LCS+滚动数组)
- hdu1513 Palindrome(LCS+滚动数组)
- hdu1513
- HDU1513:Palindrome
- hdu1513 Palindrome
- 【HDU1513】【Palindrome】
- HDU1513:Palindrome
- hdu1513 Palindrome
- hdu1513 dp
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- POJ1611 The Suspects (并查集)
- HDU--1999-不可摸数
- Trie树
- java 类型转换
- 自定义ClassLoader 绕过沙箱权限验证
- hdu1513滚动数组
- ILdasm 的使用方法
- Python性能鸡汤,非常有效的提高性能的tips
- 方言文化
- Solve It +uva+赤果果的二分
- poj-3080 blue jeans
- ios真机调试
- crontab的使用
- hdu1864 最大报销额