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;
    }
}

0 0