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

题目链接: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;
}


昨天是平铺直叙,今天就是宏观规划。加油吧,骚年!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值