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

来源:互联网 发布:金融数据分析师怎么样 编辑:程序博客网 时间:2024/05/29 18:57

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];//bufanint 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];elsell[i]=ll[i-1];}for (i=n;i>=1;i--)//bufan{ if (ss[i]=='B')  rr[i]=rr[i+1]+tm[i];elserr[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];elsell[i]=ll[i-1];}for (i=n;i>=1;i--)//fan{ if (ss[i]=='A')  rr[i]=rr[i+1]+tm[i];elserr[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;}


0 0
原创粉丝点击