AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC045-C たくさんの数式

■■■問題■■■

1以上9以下の数字のみからなる文字列Sが与えられます。

この文字列の中で、あなたはこれら文字と文字の間のうち、
いくつかの場所に+を入れることができます。一つも入れなくてもかまいません。
ただし、+が連続してはいけません。

このようにして出来る全ての文字列を数式とみなし、和を計算することができます。
ありうる全ての数式の値を計算し、その合計を出力してください。

■■■入力■■■

S

●1 <= |S| <= 10
●Sに含まれる文字は全て1〜9の数字

■■■出力■■■

ありうる全ての数式の値の総和を1行に出力せよ。


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "InputX";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("125");
            //176
            //考えられる数式としては、
            //125、1+25、12+5、1+2+5 の4通りがあります。
            //それぞれの数式を計算すると、
            //●125
            //●1+25=26
            //●12+5=17
            //●1+2+5=8
            //となり、これらの総和は 125+26+17+8=176 となります。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("9999999999");
            //12656242944
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    struct JyoutaiDef
    {
        internal int CurrInd;
        internal long CurrSum;
        internal long TotalSum;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        string S = InputList[0];
        int UB = S.Length - 1;

        var Stk = new Stack<JyoutaiDef>();
        JyoutaiDef WillPush;
        WillPush.CurrInd = 0;
        WillPush.CurrSum = 0;
        WillPush.TotalSum = 0;
        Stk.Push(WillPush);

        long Answer = 0;
        while (Stk.Count > 0) {
            JyoutaiDef Popped = Stk.Pop();

            //クリア判定
            if (Popped.CurrInd > UB) {
                Answer += Popped.CurrSum + Popped.TotalSum;
                continue;
            }

            int CurrNum = int.Parse(S[Popped.CurrInd].ToString());

            //+を使う経路
            if (Popped.CurrInd > 0) {
                WillPush.CurrInd = Popped.CurrInd + 1;
                WillPush.CurrSum = CurrNum;
                WillPush.TotalSum = Popped.TotalSum + Popped.CurrSum;
                Stk.Push(WillPush);
            }

            //+を使わない経路
            WillPush.CurrInd = Popped.CurrInd + 1;
            WillPush.CurrSum = Popped.CurrSum * 10 + CurrNum;
            WillPush.TotalSum = Popped.TotalSum;
            Stk.Push(WillPush);
        }
        Console.WriteLine(Answer);
    }
}


解説

2の9乗しかないので、深さ優先探索でナイーブに解いてます。