cf#ECR 9-B. Alice, Bob, Two Teams-DP

http://codeforces.com/contest/632/problem/B

翻转一个前缀或后缀,要求得到的B的sum最大

如果翻转前缀

预处理好ll[i] //左边翻前缀1-i

rr[i]//右边i+1到n不翻

同理,也预处理后缀的。

跑两遍dp即可


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;

const double pi=acos(-1.0);
double eps=0.000001; 
__int64 tm[5*100000+50];
char ss[5*100000+50];

__int64 ll[5*100000+50];	//fan
__int64 rr[5*100000+50];	//bufan

int main()
{
	
	__int64 n;
scanf("%I64d",&n);
	__int64 i;
	for (i=1;i<=n;i++)
	{
		scanf("%I64d",&tm[i]);
	}
	scanf("%s",ss+1); 
	
	for (i=1;i<=n;i++)	//fan
	{	 
		if (ss[i]=='A')  
			ll[i]=ll[i-1]+tm[i];
		else
			ll[i]=ll[i-1];
	}

	for (i=n;i>=1;i--)	//bufan
	{	 
		if (ss[i]=='B')  
			rr[i]=rr[i+1]+tm[i];
		else
			rr[i]=rr[i+1];
	}
	__int64 maxx=0;
	for (i=0;i<=n;i++)
	{
		if (ll[i]+rr[i+1]>maxx)
			maxx=ll[i]+rr[i+1];
	}

	for (i=1;i<=n;i++)	//bufan
	{	 
		if (ss[i]=='B')  
			ll[i]=ll[i-1]+tm[i];
		else
			ll[i]=ll[i-1];
	}

	for (i=n;i>=1;i--)	//fan
	{	 
		if (ss[i]=='A')  
			rr[i]=rr[i+1]+tm[i];
		else
			rr[i]=rr[i+1];
	}
		for (i=0;i<=n;i++)
	{
		if (ll[i]+rr[i+1]>maxx)
			maxx=ll[i]+rr[i+1];
	}
	printf("%I64d\n",maxx);
	return 0;
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值