トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem117 赤タイル, 緑タイル, そして青タイル

問題

黒い正方形のタイルと, 2ユニットの長さの赤のタイル,
3ユニットの長さの緑のタイル, 4ユニットの長さの青のタイルから選んで組み合わせて,
5ユニットの長さの1列をタイルで敷く方法はちょうど15通りある.



長さ50ユニットの1列をタイルで敷く方法は何通りあるか.


ソース

using System;

class Program
{
    //const int Unit = 5;
    const int Unit = 50;

    static void Main()
    {
        //場合の数[残りのマス]なDP表
        long[] DPArr = new long[Unit + 1];
        DPArr[Unit] = 1;

        for (int I = Unit; 1 <= I; I--) {
            if (DPArr[I] == 0) continue;

            Action<int> UpdateAct = (pLen) =>
            {
                int NewI = I - pLen;
                if (NewI >= 0) DPArr[NewI] += DPArr[I];
            };

            UpdateAct(1); //黒タイルを使う場合
            UpdateAct(2); //赤タイルを使う場合
            UpdateAct(3); //緑タイルを使う場合
            UpdateAct(4); //青タイルを使う場合
        }
        Console.WriteLine("解は{0}通り", DPArr[0]);
    }
}


実行結果

解は100808458960497通り


解説

動的計画法で解いてます。