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

二次元DPメニューのサムネイル
二次元 dp 応用 3 Kotlin編(paizaランク S 相当)

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

問題

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

あなたは paiza 植物園で働いています。
この植物園では N 個のマスが横一列にならんでおり、各マスには植木鉢が 1 つずつ置かれています。
左から i 番目のマスをマス i と表します。
あなたの仕事は各マスの植木鉢に適切な量の水を注ぐことです。
マス i の植木鉢に注ぐ水の目標量は A_i です。
あなたは以下の 2 種類の操作を、任意の順番で任意の回数だけ行うことができます。(いまいるマスをマス x とします。)

・マス x+1 にある植木鉢に水を 1 注ぐ。その後、マス x+1 に移動する。
・マス x-1 にある植木鉢に水を 1 注ぐ。その後、マス x-1 に移動する。

各操作の後、マスの外 (マス 0, マス N+1) に出るような操作を行うことはできません。
最初あなたはマス 1 におり、すべての操作を終えたあとマス 1 いなければなりません。
すべての操作後マス i の植木鉢に実際に注がれた水の量を B_i としたとき、マス 1 から始めてマス 1 で終わる操作のうち、目標量との差の総和 Σ|A_i - B_i| (1 ≦ i ≦ N) の最小値を求めてください。

入力される値

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

N
A_1 A_2 ... A_N


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


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

すべての操作後マス i の植木鉢に実際に注がれた水の量を B_i としたとき、マス 1 から始めてマス 1 で終わる操作のうち、目標量との差の総和 Σ|A_i - B_i| (1 ≦ i ≦ N) の最小値を求めてください。
最後は改行し、余計な文字、空行を含んではいけません。

条件

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

・1 ≦ N ≦ 1000
・0 ≦ A_i ≦ 100

入力例1

5
1 3 2 0 2

出力例1

2

入力例2

5
9 12 1 29 8

出力例2

23

入力例3

20
85 53 100 84 3 7 97 2 16 21 85 3 26 17 36 42 11 83 28 29

出力例3

306

問題一覧へ戻る

ページの先頭へ戻る