[学習記録]AtCoder EDP A-Frog 1 [Go]
問題文
N 個の足場があります。 足場には 1,2,…,N と番号が振られています。 各 i (1≤i≤N) について、足場 i の高さは hi です。
最初、足場 11 にカエルがいます。 カエルは次の行動を何回か繰り返し、足場 N まで辿り着こうとしています。
足場 i にいるとき、足場 i+1 または i+2 へジャンプする。 このとき、ジャンプ先の足場を j とすると、コスト ∣hi−hj∣ を支払う。
カエルが足場 N に辿り着くまでに支払うコストの総和の最小値を求めてください。
解法
iの足場につくためのコストの総和の最小がわかればいい
i の足場には i -1, i -2からしか来れないので、
// コストを計算
c1 := dp[i-1] + Abs(sli[i-1]-sli[i])
c2 := dp[i-2] + Abs(sli[i-2]-sli[i])
// 小さいほうを保持
dp[i] = Min(c1, c2)
i = 1の時はi = 0からの繊維しかないため、dp[1]にはそのままコストを入れる
dp[1] = Abs(sli[0] - sli[1])
i = 2より、すべての i について計算し、dp[n -1]が回答になる(n番目の足場の最小値)
コード(AC)
func run() interface{} {
n := readInt()
sli := readSli(n) // save cost
dp := make([]int, n)
dp[1] = Abs(sli[0] - sli[1])
for i := 2; i < n; i++ {
c1 := dp[i-1] + Abs(sli[i-1]-sli[i])
c2 := dp[i-2] + Abs(sli[i-2]-sli[i])
dp[i] = Min(c1, c2)
}
ans := dp[n-1]
return ans
}
この記事が気に入ったらサポートをしてみませんか?