您的位置:首页 > 其它

【备战蓝桥杯】USACO--> Beads 2.0

2014-01-26 22:05 288 查看
题目链接: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
;
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;
}


昨天是平铺直叙,今天就是宏观规划。加油吧,骚年!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: