LoginSignup
1
0

More than 5 years have passed since last update.

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

Posted at

動的計画法とは

解きたい問題

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番目まで: 全ての切れ目で切る、が最適解
 ・ 最終段階: 最後の切れ目のみ切る、に最適解が変わる

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

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

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0