链接:http://acm.hdu.edu.cn/showproblem.php?pid=4561
题目中文,不做解释了
刚开始没多想就直接开写DP,测试了很多数据还是WA,结果再读题,N最大10000,汗,2^10000那得多大了,于是就转换了思路
给出的数字串中0天然地将字符串分成若干2或-2组成的连续段,将题目意思转换下就是求一个最长的连续的2或-2组成的连续串同时保证其中的-2的个数为偶数。一个连续串(长度为len)中-2数量cnt为偶数自不用说,直接判断len和ans大小就是。奇数的情况,cnt减1就是偶数,肯定是不要第一个-2或最后一个-2才能保证最长,于是得到两个长度a,b,再判断a,b最大那个和ans大小就行了。
写了一遍发现其实数组都不需要用,复杂度是O(n)应该没办法再优化了,但是运行了93MS,hdu上有31MS的,可能是代码有点丑,有优化代码的请留言,一起学习下嘛!
#include<stdio.h>
int main()
{
int cas,n,i,j,num;
scanf("%d",&cas);
for(j=1;j<=cas;j++)
{
scanf("%d",&n);
int ans=0,idx1=-1,idx2=-1,len=0,cnt=0;
for(i=0;i<=n;i++)
{
if(i!=n)
scanf("%d",&num);
else
num=0;
if(!num)
{
if(len)
{
if(cnt%2==0&&len>ans)
ans=len;
else
{
int a=len-idx1,b=idx2-1;
if(a>ans)
ans=a;
if(b>ans)
ans=b;
}
cnt=len=0;
idx1=idx2=-1;
}
}
else
{
len++;
if(num==-2)
{
cnt++;
if(idx1==-1)
idx1=idx2=len;
if(len>idx2)
idx2=len;
}
}
}
printf("Case #%d: %d\n",j,ans);
}
return 0;
}
本文提供了一种解决HDU 4561问题的有效算法,通过分析数字串特性,采用O(n)复杂度实现,避免了传统DP方法带来的巨大空间消耗。
4000

被折叠的 条评论
为什么被折叠?



