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;
	
}


你可能感兴趣的:(cf#ECR 9-B. Alice, Bob, Two Teams-DP)