您的位置:首页 > 其它

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

2016-03-02 01:12 309 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: