坏掉的项链

题目描述

你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 n=29 的二个例子:

第一和第二个珠子在图片中已经被作记号。

图片 A 中的项链可以用下面的字符串表示:

brbrrrbbbrrrrrbrrbbrbbbbrrrrb

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

例如,在图片 A 中的项链中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链可以收集到8个珠子。

白色珠子什么意思?

在一些项链中还包括白色的珠子(如图片B) 所示。

当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。

表现含有白珠项链的字符串将会包括三个符号 r , b 和 w 。

写一个程序来确定从一条被给出的项链可以收集到的珠子最大数目。

输入输出格式

输入格式:

 

第 1 行: N, 珠子的数目

第 2 行: 一串长度为N的字符串, 每个字符是 r , b 或 w。

 

输出格式:

 

输入输出样例

输入样例#1:
29 
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
输出样例#1:
11
两种方法不知为啥 一种错了俩点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;//不考虑白 
int n,red[800],blue[800],ans;
char a[800];
int main()
{
    scanf("%d\n",&n);
    char c;
    for(int i=1;i<=n;i++)
    {
        cin>>c;
        a[i]=c;a[i+n]=c;        
    }
    for(int i=1;i<=2*n;i++)
     {
        if(a[i]=='r')
         {
             red[i]=red[i-1]+1;
         }
        else if(a[i]=='b')
         {
             blue[i]=blue[i-1]+1;
         } 
        else if(a[i]=='w')
         {
             blue[i]=blue[i-1]+1;
             red[i]=red[i-1]+1;
         } 
     }
    
    for(int i=n+n-2;i>=0;i--)
    {
        if(a[i]=='r')
        {
            if(a[i+1]!='b')    red[i]=max(red[i],red[i+1]);
             if(a[i+1]=='b')    blue[i]=blue[i+1];
        }else
        if(a[i]=='b')
        {
            if(a[i+1]!='r')    blue[i]=max(blue[i],blue[i+1]);
             if(a[i+1]=='r')    red[i]=red[i+1];
        }else
        {
            red[i]=max(red[i],red[i+1]);
            blue[i]=max(blue[i],blue[i+1]);
        }
        ans=max(red[i]+blue[i+1],ans);
        ans=max(blue[i]+red[i+1],ans);
            
    }
    cout<<ans;
    return 0;
} 错了俩点

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int n,red[800],blue[800],ans;
char a[800];
int main()
{
    scanf("%d\n",&n);
    char c;
    for(int i=1;i<=n;i++)
    {
        cin>>c;
        a[i]=c;a[i+n]=c;        
    }
    for(int i=1;i<=n;i++)
    {
        int j=i,tot=0;
        char c=a[i];
        while(a[j]==c||a[j]=='w')
            {
                if(!j)    j=n;
                tot++;
                j--;
            }
        c=a[i+1];
        j=i+1;
        while(a[j]==c||a[j]=='w')
        {
            j++;
            tot++;
        }
        ans=max(tot,ans);
        if(ans>n)
        {
            cout<<n;
            return 0;
        }
    }
    cout<<ans;
    return 0; 
}

 

 
posted @ 2017-03-15 14:53  浪矢-CL  阅读(294)  评论(0编辑  收藏  举报