動的計画法の取り込み方に関する質問


動的計画法とは

解きたい問題

1本の水ようかんがある。

3つの切れ目が入っており、最大で4分割できる。

4分割した時の長さは順番にL_1、L_2、L_3、L_4(1<=L_i<=10, 1<=i<=4)で与えられる。

分割した後の長さがなるべく均等になるようにした時の、最大の長さと最小の長さの差を出力せよ。

ただし、最低1箇所は切るものとする

(日本情報オリンピック2017 予選問4 をベースにしたもの)

入力パターン

L_1~L_4 が

9
4
6
7

と与えられるとき。

(※) 総当たりで簡単にいけます(2番目の切れ目を切ればOK)が、動的計画法というものを理解したい点をご理解ください

現状の理解

動的計画法は、

  • 前回の計算結果を、今回の計算に活かす。これを最終段階まで繰り返す

というのが、現状の私なりの理解(不足していると思うので、アドバイス大歓迎です)。

試したアプローチ

とりあえず、ゴールの一歩手前である

9
4
6

の段階での最適解を、次に活かすアプローチを考えた。

この場合は、

  • 1番目の切れ目に切れば最小9、最大10。-> この時点での最適解!
  • 2番目の切れ目を切れば最小6、最大13。
  • 両方切れば最小4、最大9。
  • 全部切らなければ最小19、最大19(ただし、最後で切ると最適でないのが自明なので除外)

筆者「なるほど、1番目の切れ目で切った結果を使いまわせばよいのか」。

で、最後のL_4

7

を考える。

L_3までの最適解にしたがって計算すると

  • 3番目の切れ目を切れば最小7、最大10
  • 3番目の切れ目を切らなければ最小9、最大17

差は3となる。

でも、これが答えかというと違ってて、L_3まででは最適でないケースだった

  • 2番目の切れ目を切れば最小6、最大13。

の時に、

  • 3番目の切れ目を切れば最小6、最大13
  • 3番目の切れ目を切らなければ最小13、最大13

と、差が0となるケースが出る。途中段階の最適解を使いまわせないことになる。

質問事項

まとめると、

  • 途中経過でずっと最適解と思っていたものが、以降の段階で覆される

というケースを、動的計画法の考え方でどう落とし込めばいいかがわからない。どう理解すればいいのでしょうか?

今回は4個のケースだったが、引用元の問題では最大50程度になる。

L_iの大きさも、最大1000程度までになる。

そうすると、49番目までずっと正解の切り方だったものが、最後の50番目で覆されるパターンも出てくる。

例えば、

1
:
(1 が 49個)
:
1
49

という感じのもの。

 ・ 49番目まで: 全ての切れ目で切る、が最適解
 ・ 最終段階: 最後の切れ目のみ切る、に最適解が変わる

これが理解できれば、動的計画法という得体の知れない魔物の攻略に、一歩近づくと思うのだが...

皆さんの知恵・経験をお貸しいただければと思います。