トップページに戻る    次の増井さんの書籍の問題へ    前の増井さんの書籍の問題へ

Q53 いたずらされたお菓子


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        //場合の数[御菓子の状態]なDP表
        var PrevDP = new Dictionary<string, long>();
        PrevDP["AAAAAABBBBBBCCCCCCDDDDDDEEEEEE"] = 1;

        for (int I = 1; I <= 5 * 6; I++) {
            string TutumiGami = "";
            if (I <= 6) TutumiGami = "A";
            else if (I <= 12) TutumiGami = "B";
            else if (I <= 18) TutumiGami = "C";
            else if (I <= 24) TutumiGami = "D";
            else TutumiGami = "E";

            var CurrDP = new Dictionary<string, long>();
            foreach (var EachPair in PrevDP) {
                Action<string> UpdateAct = pTarget =>
                {
                    if (pTarget == TutumiGami) return;
                    int wkInd = EachPair.Key.IndexOf(pTarget);
                    if (wkInd == -1) return;

                    string NewKey = EachPair.Key.Remove(wkInd, 1);

                    if (CurrDP.ContainsKey(NewKey)) {
                        CurrDP[NewKey] += EachPair.Value;
                    }
                    else CurrDP[NewKey] = EachPair.Value;
                };
                UpdateAct("A"); UpdateAct("B"); UpdateAct("C");
                UpdateAct("D"); UpdateAct("E");
            }
            PrintDP(CurrDP);
            PrevDP = CurrDP;
        }
        Console.WriteLine("答えは{0}通り", PrevDP[""]);
    }

    static void PrintDP(Dictionary<string, long> pDP)
    {
        foreach (var EachPair in pDP.OrderBy(X => X.Key)) {
            Console.WriteLine("{0}の場合の数={1}", EachPair.Key, EachPair.Value);
        }
    }
}


実行結果

省略
DDの場合の数=103727050595452
DEの場合の数=115332374088864
EEの場合の数=87527929503456
Aの場合の数=481543029347284
Bの場合の数=481543029347284
Cの場合の数=481543029347284
Dの場合の数=481543029347284
Eの場合の数=461329496355456
の場合の数=1926172117389136
答えは1926172117389136通り


解説

String型で状態を管理する動的計画法で解いてます。