USACO-1.1.4 Broken necklace

来源:互联网 发布:js 二维数组遍历 编辑:程序博客网 时间:2024/05/22 00:55

题意:假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。

题解:DP 深搜
1. 将原字符串复制一份加在后面, 将链转换成线性关系
2. 创建四个数组:
(下标)在i-1 和 i 之间 分割
lb[i] , lr[i] 指左边最多(不包括下标为i)的蓝珠,红珠的个数
rb[i] , rr[i] 指右边最多(包括下标为i)的蓝珠,红珠的个数

/*ID:jsntrdy1PROG: beads LANG: C++*/#include<cstdio>#include<iostream>#include<cstring>#include<fstream>using namespace std;ifstream fin("beads.in");ofstream fout("beads.out");const int N=360;string str;int lb[N*2],lr[N*2],rb[N*2],rr[N*2];int main(){    int n;    fin>>n>>str;    str+=str;    for(int i=1;i<=n*2;i++)    {        if(str[i-1]=='b')          lb[i]=lb[i-1]+1;        else if(str[i-1]=='r')          lr[i]=lr[i-1]+1;        else        {           lb[i]=lb[i-1]+1;           lr[i]=lr[i-1]+1;         }        }    for(int i=n*2-1;i>=0;i--)    {        if(str[i]=='b')          rb[i]=rb[i+1]+1;        else if(str[i]=='r')          rr[i]=rr[i+1]+1;        else        {           rb[i]=rb[i+1]+1;            rr[i]=rr[i+1]+1;        }      }    int ans=0;    for(int i=0;i<=n*2-1;i++)      ans=max(max(lb[i],lr[i])+max(rb[i],rr[i]),ans);    if(ans>=n)      ans=n;    fout<<ans<<endl;    return 0;}