トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ABC-040-C 柱柱柱柱柱
■■■問題■■■
N本の木の柱が左から右へ一列に並んだアスレチックがあります。
左からi本目の柱の高さはaiセンチメートルです。
高橋君は左から1本目の柱からスタートし、
右へ柱を渡っていきN本目の柱まで行こうとしています。
高橋君がある柱にいるとき、
次には現在の柱から1個もしくは2個右にある柱のどちらかへ移動することができます。
移動するときには、現在いる柱の高さと、
移動後の柱の高さの差の絶対値のぶんだけコストがかかります。
N本目の柱まで行くとき、コストの合計の最小値はいくらになるでしょうか。
■■■入力■■■
N
a1 a2 ・・・ aN
●2 <= N <= 10万
●0 <= ai <= 1万
●ai はすべて整数である。
■■■出力■■■
1本目の柱からN本目の柱へ移動するまでに必要な合計コストの最小値を1行に出力せよ。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("4");
WillReturn.Add("100 150 130 120");
//40
//このケースでは以下のような移動によって最小コストを達成できる。
//●1本目の柱から3本目の柱へ移動する。(コスト 30)
//●3本目の柱から4本目の柱へ移動する。(コスト 10)
//合計コストは40となる。
}
else if (InputPattern == "Input2") {
WillReturn.Add("4");
WillReturn.Add("100 125 80 110");
//40
//このケースでは以下のような移動によって最小コストを達成できる。
//●1本目の柱から2本目の柱へ移動する。(コスト 25)
//●2本目の柱から4本目の柱へ移動する。(コスト 15)
//合計コストは40となる。
}
else if (InputPattern == "Input3") {
WillReturn.Add("9");
WillReturn.Add("314 159 265 358 979 323 846 264 338");
//310
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] AArr = InputList[1].Split(' ').Select(X => int.Parse(X)).ToArray();
int UB = AArr.GetUpperBound(0);
//最小コスト[添字]なDP表
var DPArr = new Nullable<int>[UB + 1];
DPArr[0] = 0;
for (int I = 0; I <= UB; I++) {
Action<int> UpdateAct = pNewInd =>
{
if (pNewInd > UB) return;
int CurrCost = DPArr[I].Value + Math.Abs(AArr[I] - AArr[pNewInd]);
if (DPArr[pNewInd].HasValue == false
|| DPArr[pNewInd].Value > CurrCost)
DPArr[pNewInd] = CurrCost;
};
UpdateAct(I + 1);
UpdateAct(I + 2);
}
Console.WriteLine(DPArr[UB]);
}
}
解説
配るDPで、コスト合計の最小値[添字]を更新してます。