题目链接:http://wikioi.com/problem/1542/
昨天运行一下才发现,原来超过时间了。= =,囧了,于是去找有什么方法可以优化一下速度。毕竟我的算法的时间复杂度是O(n²)。太恐怖了。
寻找提示,发现可以尝试使用动态规划。
动规真是个好东西,从宏观的角度去思考这个问题,把问题细节化到每一个小点上。而且就比赛本身而言,一般来说空间是给够了的。因此,大胆用空间来弥补时间的不足吧。
#include <stdio.h>
#include <string.h>
#define N 360
int bl[N*2],br[N*2],rl[N*2],rr[N*2];
int main()
{
int len;
char input[N];
scanf("%d",&len);
scanf("%s",input);
char str[N*2];
strcpy(str,input);
strcat(str,input);
bl[0] = rl[0] = 0;
br[len*2-1] = rr[len*2-1] = 0;
int i;
/*
全部是一样的情况下,就会多算。
循环算,
4
bbbb bbbb
bl 0123 4567
br 0
*/
for(i=1 ; i< 2*len ; i++)
{
if( str[i] == 'r')
{
rl[i] = rl[i-1] + 1;
bl[i] = 0;
}
else if( str[i] == 'b')
{
bl[i] = bl[i-1] + 1;
rl[i] = 0;
}
else
{
bl[i] = bl[i-1] + 1;
rl[i] = rl[i-1]+1;
}
}
for(i=2*len-2 ; i >= 0 ; i--)
{
if( str[i] == 'r')
{
rr[i] = rr[i+1] + 1;
br[i] = 0;
}
else if( str[i] == 'b')
{
br[i] = br[i+1]+1;
rr[i] = 0;
}
else
{
rr[i] = rr[i+1] + 1;
br[i] = br[i+1]+1;
}
}
int max= 0 ;
int maxl,maxr;
for(i=0 ;i< 2*len-1 ; i++)
{
maxl = bl[i] > rl[i] ? bl[i]:rl[i];
maxr = br[i+1] > rr[i+1] ? br[i+1] : rr[i+1] ;
max = (maxl+maxr)>max ? (maxl+maxr):max;
}
max = max > len ? len : max;
printf("%d",max);
return 0;
}
昨天是平铺直叙,今天就是宏观规划。加油吧,骚年!