AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC026-C 高橋君の給料
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("5");
WillReturn.Add("1");
WillReturn.Add("1");
WillReturn.Add("1");
WillReturn.Add("1");
//3
}
else if (InputPattern == "Input2") {
WillReturn.Add("7");
WillReturn.Add("1");
WillReturn.Add("1");
WillReturn.Add("2");
WillReturn.Add("2");
WillReturn.Add("3");
WillReturn.Add("3");
//7
}
else if (InputPattern == "Input3") {
WillReturn.Add("6");
WillReturn.Add("1");
WillReturn.Add("2");
WillReturn.Add("3");
WillReturn.Add("3");
WillReturn.Add("2");
//11
}
else if (InputPattern == "Input4") {
WillReturn.Add("10");
WillReturn.Add("1");
WillReturn.Add("2");
WillReturn.Add("3");
WillReturn.Add("4");
WillReturn.Add("5");
WillReturn.Add("6");
WillReturn.Add("7");
WillReturn.Add("8");
WillReturn.Add("9");
//1023
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
// 隣接リスト
static Dictionary<int, List<int>> mToNodeArrDict = new Dictionary<int, List<int>>();
static Dictionary<int, int> mDPDict = new Dictionary<int, int>();
static void Main()
{
List<string> InputList = GetInputList();
int N = int.Parse(InputList[0]);
for (int I = 1; I <= N - 1; I++) {
int ParentNode = int.Parse(InputList[I]);
int ChildNode = I + 1;
if (mToNodeArrDict.ContainsKey(ParentNode) == false) {
mToNodeArrDict[ParentNode] = new List<int>();
}
mToNodeArrDict[ParentNode].Add(ChildNode);
}
// メモ化再帰で解く
DFS(1);
Console.WriteLine(mDPDict[1]);
}
static int DFS(int pCurrNode)
{
if (mDPDict.ContainsKey(pCurrNode)) {
return mDPDict[pCurrNode];
}
var ChildNodeList = new List<int>();
if (mToNodeArrDict.ContainsKey(pCurrNode)) {
ChildNodeList.AddRange(mToNodeArrDict[pCurrNode]);
}
var KouhoList = new List<int>();
ChildNodeList.ForEach(pX => KouhoList.Add(DFS(pX)));
int CurrVal = 1;
if (KouhoList.Count > 0) {
CurrVal += KouhoList.Min();
CurrVal += KouhoList.Max();
}
return mDPDict[pCurrNode] = CurrVal;
}
}
解説
メモ化再帰で解いてます。