1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 二次元DPメニュー(言語選択)
  4. 問題一覧 Go編
  5. 二次元 DP 基礎 3 Go編

二次元DPメニューのサムネイル
二次元 DP 基礎 3 Go編(paizaランク A 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

長さ N の数列 A = (A_1, A_2, ... A_N) があります。
あなたは以下の 2 種類の操作を、任意の順番で任意の回数だけ行うことができます。

・操作 1 : 1 ≦ i ≦ N を満たす i を 1 つ選び、 A_i に 1 減算する
・操作 2 : 1 ≦ i ≦ N を満たす i を 1 つ選び、 A_i に 1 加算する

数列のすべての隣接する要素の差の絶対値が 1 以下であるような数列を良い数列と呼びます。
より形式的には、長さ N の数列 B = (B_1, B_2, ... , B_N) が以下の条件を満たすとき、B は良い数列です。
・すべての i (1 ≦ i ≦ N-1) に対して |B_i - B_{i+1}| ≦ 1

与えられた数列 A を良い数列にするために必要な操作回数の最小値を出力してください。

入力例 1 では、以下のように操作することで良い数列を得ることができます。
・i = 2 として操作 1 を 3 回行う
・i = 4 として操作 2 を 2 回行う
操作後の数列は [5, 5, 4, 3] であり、これは良い数列です。
4 回以下の操作で良い数列を得ることはできないので、5 を出力します。

入力される値

入力は以下のフォーマットで与えられます。

N
A_1 A_2 ... A_N


・1 行目には、数列の長さを表す整数 N が与えられます。
・2 行目には、数列 A の各要素が空白区切りで与えられます。
・入力は合計で 2 行からなり、入力値最終行の末尾に改行が 1 つ入ります。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

与えられた数列 A をいい数列にするために必要な操作回数の最小値を出力してください。
最後は改行し、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ N ≦ 2000
・0 ≦ A_i ≦ 1000

入力例1

4
5 8 4 1

出力例1

5

入力例2

15
742 916 805 618 76 67 243 657 638 246 16 767 0 253 460

出力例2

4215

問題一覧へ戻る

ページの先頭へ戻る