競技プログラミングの鉄則
   次の問題へ
   前の問題へ
B38 Heights of Grass
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static string InputPattern = "InputX";
    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();
        if (InputPattern == "Input1") {
            WillReturn.Add("7");
            WillReturn.Add("AABBBA");
            //15
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }
    static void Main()
    {
        List<string> InputList = GetInputList();
        string S = InputList[1];
        S = S.Replace("A", "+").Replace("B", "-");
        S = "+" + S; // 1番左の高さを0と考える
        int UB = S.Length - 1;
        int[] HeightArr = new int[UB + 1];
        // マイナスの場所の高さを決定する
        int SeqMinusCnt = 0;
        for (int I = UB; 0 <= I; I--) {
            if (S[I] == '-') {
                HeightArr[I] = ++SeqMinusCnt;
            }
            else {
                SeqMinusCnt = 0;
            }
        }
        // プラスの場所の高さを決定する
        int CurrHeight = 0;
        for (int I = 0; I <= UB; I++) {
            if (S[I] == '-') {
                CurrHeight = 1;
                continue;
            }
            CurrHeight++;
            if (I + 1 <= UB && S[I + 1] == '-') {
                CurrHeight = Math.Max(CurrHeight, HeightArr[I + 1] + 1);
            }
            HeightArr[I] = CurrHeight;
        }
        Console.WriteLine(HeightArr.Sum());
    }
}
解説
考察すると、
マイナスが連続した場所は、末項1、公差-1の等差数列になります。
後は、マイナスの左のプラスの高さで特殊処理を行いつつ
プラスの場合には、高さをインクリメントするようにしてます。