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;
}
翻转一个前缀或后缀,要求得到的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;
}
相关文章推荐
- c语言数据类型 之 内存对齐与位段
- 程序员必须知道的10大基础实用算法及其讲解
- iOS:手把手教你发布代码到CocoaPods(Trunk方式)
- maven 相关命令记录
- Delphi通过查找字符定位TADOQuery数据的位置
- HDU 4549 M斐波那契数列(矩阵快速幂&费马小定理)
- 5.7 Python API(for Elasticsearch)
- VMware 安装 Ubuntu 12 遇到坑 VMware是什么 不是虚拟机
- JavaScript中创建字典对象(dictionary)实例
- Delphi在DBGridEh改变选中行颜色
- Android中View自定义XML属性详解以及R.attr与R.styleable的区别
- UVA11741 轮廓线动态规划(矩阵加速)
- NDK开发
- JS中遍历普通数组和字典数组的区别
- tomcat日志,根据关键字定位到行
- XmlHttpRequest
- Java中值类型与引用类型
- String字符串2
- 正则表达式
- Android 应用程序无缝设计