競技プログラミングの鉄則    次の問題へ    前の問題へ

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の等差数列になります。

後は、マイナスの左のプラスの高さで特殊処理を行いつつ
プラスの場合には、高さをインクリメントするようにしてます。