トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Problem172 桁の繰り返しが少ない数
問題
どの数字も3回を超えて現れないような18桁の数(先頭の0は許されない)はいくつあるか?
ソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
//場合の数[0123456789の登場数]なDP表
var PrevDP = new Dictionary<string, long>();
for (int I = 1; I <= 9; I++) {
char[] wkCharArr = new string('0', 10).ToCharArray();
wkCharArr[I]++;
PrevDP.Add(new string(wkCharArr), 1);
}
for (int I = 2; I <= 18; I++) {
var CurrDP = new Dictionary<string, long>();
foreach (var EachPair in PrevDP) {
for (int J = 0; J <= 9; J++) {
if (EachPair.Key[J] == '3') continue;
char[] NewKeyArr = EachPair.Key.ToCharArray();
NewKeyArr[J]++;
string NewKeyStr = new string(NewKeyArr);
if (CurrDP.ContainsKey(NewKeyStr))
CurrDP[NewKeyStr] += EachPair.Value;
else CurrDP[NewKeyStr] = EachPair.Value;
}
}
PrevDP = CurrDP;
}
Console.WriteLine("{0}通り", PrevDP.Values.Sum());
}
}
実行結果
227485267000992000通り
解説
桁DPで解いてます。