並び順

ブックマーク数

期間指定

  • から
  • まで

1 - 40 件 / 83件

新着順 人気順

動的計画法の検索結果1 - 40 件 / 83件

  • 最強最速アルゴリズマー養成講座:アルゴリズマーの登竜門、「動的計画法・メモ化再帰」はこんなに簡単だった (1/5) - ITmedia エンタープライズ

    動的計画法とメモ化再帰 今回は、非常によく用いられるアルゴリズムである、「動的計画法」「メモ化再帰」について説明します。この2つはセットで覚えて、両方使えるようにしておくと便利です。 なお、メモ化再帰に関しては、第5・6回の連載の知識を踏まえた上で読んでいただけると、理解が深まります。まだお読みになっていない方は、この機会にぜひご覧ください。 中学受験などを経験された方であれば、こういった問題を一度は解いたことがあるのではないでしょうか。小学校の知識までで解こうとすれば、少し時間は掛かるかもしれませんが、それでもこれが解けないという方は少ないだろうと思います。 この問題をプログラムで解こうとすると、さまざまな解法が存在します。解き方によって計算時間や有効範囲が大きく変化しますので、それぞれのパターンについて考えます。 以下の説明では、縦h、横wとして表記し、プログラムの実行時間に関しては、

      最強最速アルゴリズマー養成講座:アルゴリズマーの登竜門、「動的計画法・メモ化再帰」はこんなに簡単だった (1/5) - ITmedia エンタープライズ
    • 病みつきになる「動的計画法」、その深淵に迫る

      数回にわたって動的計画法・メモ化再帰について解説してきましたが、今回は実践編として、ナップサック問題への挑戦を足がかりに、その長所と短所の紹介、理解度チェックシートなどを用意しました。特に、動的計画法について深く掘り下げ、皆さんを動的計画法マスターの道にご案内します。 もしあなたが知ってしまったなら――病みつきになる動的計画法の集中講義 前回の『アルゴリズマーの登竜門、「動的計画法・メモ化再帰」はこんなに簡単だった』で動的計画法とメモ化再帰を説明しましたが、前回の説明ではまだ勘所をつかめていない方がほとんどでしょう。そこで、これらを完全にマスターするため、今回はもう1つ具体例を挙げながら練習したいと思います。 どういった問題を採用するかは悩みましたが、非常に有名な「ナップサック問題」を取り上げて説明します。 ナップサック問題とは以下のような問題です。 幾つかの品物があり、この品物にはそれぞ

        病みつきになる「動的計画法」、その深淵に迫る
      • 動的計画法が苦手な人が、動的計画法が超苦手な人へアドバイスしてみる - じじいのプログラミング

        この記事は、Competitive Programming Advent Calendar Div2013(http://partake.in/events/3a3bb090-1390-4b2a-b38b-4273bea4cc83)の8日目の記事です。 動的計画法(Dynamic Programming, DP)についての記事です。 12/9 前編にサンプルプログラム(http://ideone.com/2B7f4v)を追加しました 12/11 前編の図2つを差し替えました。 はじめに まずは、本やネットの資料で、動的計画法についてのすばらしい解説はいろいろありますので、まずはそれらを参考に。 プログラミングコンテストでの動的計画法 http://www.slideshare.net/iwiwi/ss-3578511 最強最速アルゴリズマー養成講座:アルゴリズマーの登竜門、「動的計画法・メ

          動的計画法が苦手な人が、動的計画法が超苦手な人へアドバイスしてみる - じじいのプログラミング
        • 動的計画法を実現する代数〜トロピカル演算でグラフの最短経路を計算する〜 - Qiita

          トロピカル半環と呼ばれる代数構造上のトロピカル行列を利用すると動的計画法を使ってグラフの最短経路の距離を計算するという問題が単純な行列積で解けてしまうらしい。そんな噂12を聞きつけて我々はその謎を解き明かすべく南国(トロピカル)の奥地へと向かった。 トロピカルな世界に行くためにはまずは代数を知る必要がある。要するに群・環・体の話だ。しかしこの記事の目的は代数学入門ではないので詳しい話は他の記事3に譲るとし、さっそく半環という概念を導入する。それは 半環は以下の性質を満たす二つの二項演算、即ち加法(和)"$+$" と乗法(積)"$\cdot$" とを備えた集合$R$を言う $(R, +)$ は単位元 $0$ を持つ可換モノイドを成す: $(a + b) + c = a + (b + c)$ $0 + a = a + 0 = a$ $a + b = b + a$ $(R, \cdot)$ は単

            動的計画法を実現する代数〜トロピカル演算でグラフの最短経路を計算する〜 - Qiita
          • 動的計画法によるDVDのディスク分割の改善

            こんにちは。「家族アルバム みてね」の開発チームに所属している黒川と申します。今回は、その「みてね」の機能の1つで、写真や動画をDVDにして注文できる機能を動的計画法を使って改善した話をします。 「みてね」では家族の写真や動画をアップロードし、アプリ上で月ごとに振り返ることが可能になっています。一方、たとえば自宅のテレビやパソコンでまとめて振り返りたいという要望もあり、「みてね」では最長過去1年間の写真や動画をDVDにまとめて注文することができます。 このときに問題となるのがDVDのディスク分割です。1年分の写真や動画はともすると1枚のディスクに収まりきらず、複数のディスクに分割する必要があります。いままでは、動画を月ごとに分けて各ディスクに入れていく、というシンプルなアルゴリズムで分割を行っていました。しかし、ユーザーさんからは「1枚のディスクにすこしの動画しかないがどうなっているのか」

              動的計画法によるDVDのディスク分割の改善
            • 制御理論としての動的計画法 - Qiita

              はじめに:冷戦と動的計画法 動的計画法とは何でしょうか? いきなりですが、日本語版Wikipediaを引用します。 動的計画法 - Wikipedia 動的計画法(どうてきけいかくほう、英: Dynamic Programming, DP)は、計算機科学の分野において、アルゴリズムの分類の1つである。対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法を総称してこう呼ぶ。 おそらく、Qiitaを見る人の大半もこのような認識ではないでしょうか。 「あーなんかナップサック問題とか解くんでしょ? 表の数字を端から埋めていくやつ」 というイメージがあるのではないでしょうか(偏見)。 では次に、英語版Wikipediaを見てみましょう。冒頭を日本語訳します。 Dynamic programming - Wikipedia 動的計画法は、数理最適化手法ならびにコンピュ

                制御理論としての動的計画法 - Qiita
              • プログラミングコンテストでの動的計画法

                Introductory materials for Ziktas, a corporate reskilling training programkishita2

                  プログラミングコンテストでの動的計画法
                • 動的計画法とナップサック問題を学びたい人におすすめのサイト - ダウンロードたけし(寅年)の日記

                  組み合わせ最適化の手法として「動的計画法」というモノがあります。 wikipediaから抜粋 動的計画法(どうてきけいかくほう、英: Dynamic Programming, DP) コンピュータ科学の分野において、ある最適化問題を複数の部分問題に分割して解く際に、そこまでに求められている以上の最適解が求められないような部分問題を切り捨てながら解いていく手法 一見難しそうですが、実は理解するのは以外と簡単です。いろいろな場面で応用が利く便利な手法ですので、覚えておいて損はないものです。コンピュータ系、情報系のお勉強をする人であれば、おそらく一度は習ったりするかもしれません。 ナップサック問題と動的計画法 動的計画法の一番親しみやすそうな例として「ナップサック問題」というのがよく取り上げられます。 こんな感じの問題です。 今ここに様々な大きさの品物が置いてあるとします。そしてそれらの品物は各

                    動的計画法とナップサック問題を学びたい人におすすめのサイト - ダウンロードたけし(寅年)の日記
                  • 動的計画法を学ぶリソース・練習問題まとめ - フリーフォーム フリークアウト

                    移転しました http://please-sleep.cou929.nu/20100708.html

                      動的計画法を学ぶリソース・練習問題まとめ - フリーフォーム フリークアウト
                    • 企業で働くということ - (衝)動的計画法

                      僕は今エムスリーという企業でアルバイトをしている。 この企業をご存知ない人もいるかもしれない。医療従事者向けのサービスを主体としているからだ。だから医師はほとんどが知っている。 調べてみるとこの企業、東証一部に上場しておりグループ全体の従業員数が5000人、四半期の売上が800億円くらいあるかなり巨大な企業だ。 僕は(これでも)医学生なので企業の名前は知っていたが特に興味関心があるわけではなかった。 ある日 Twitterを見ているとエムスリーで機械学習をやっているエンジニアが採用募集のツイートをしていたので「インターン行ってもいいですか」と軽いノリでDMを送ったら軽いノリで承諾が返ってきた。以降業務内容は企業の機密上書けないがインターン採用までとインターン期間、インターン期間が終わった後のアルバイト期間について思ったことを書いていこうと思う。 採用まで まず「機械学習チームに限らずインタ

                        企業で働くということ - (衝)動的計画法
                      • アルゴリズムイントロダクション15章 動的計画法

                        4. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5

                          アルゴリズムイントロダクション15章 動的計画法
                        • 典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~ - Qiita

                          はじめに --- DP は役に立つ はじめまして。NTTデータ数理システムでアルゴリズムを探求している大槻 (通称、けんちょん) です。 好きなアルゴリズムは最小カットやマッチングですが、会社ではなぜか「DP が好きな人」と呼ばれています。 巷ではよく「DP なんて実務では使わない」といった言説が定期的に流れますが、そんなことはないです。僕自身この 2 年間で DP が使える実務案件に 3 件くらい関わりました! それはともかくとして、DP を学び立ての方がよく抱く悩みとして「バリエーションが多すぎて混乱するし、統一的なフレームワークがほしい」というのがあります。確かに DP のバリエーションは非常に多岐にわたるのですが、そのほとんどが以下の 3 つのフレームワークで説明できると思います: ナップサック DP 区間 DP bit DP 今回はこのうちのナップサック DP について、とにかく

                            典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~ - Qiita
                          • 動的計画法超入門! Educational DP Contest の A ~ E 問題の解説と類題集 - Qiita

                            0. はじめに: 非常に素敵な DP の入門コンテンツ 待ちに待ったコンテストの到来です!!!!! DP (動的計画法) はアルゴリズムの登竜門というべき難所ですが、いくつか問題を解いて行くとパターンのようなものが見えて来ます。まさに「習うより慣れろ」の世界で、たくさん問題を解いて行くうちに、DP な問題の解法を一言で言えるようになって来ます。 典型を学ぶ方法論として、その最も典型的なシンプルな形をした問題をそのまま吸収してしまうのは 1 つの有効な方法だと思います。それにふさわしいシンプルな問題たちを集めた DP コンテストが先日開かれました。DP 以外にもこういうのが欲しい気持ちになりますね。 Educational DP Contest / DP まとめコンテスト 全部で A 問題から Z 問題まで 26 問あります。今回はこれらの問題に対し 簡単なコメントや解説、その他の解説へのリ

                              動的計画法超入門! Educational DP Contest の A ~ E 問題の解説と類題集 - Qiita
                            • 動的計画法 - Wikipedia

                              動的計画法(どうてきけいかくほう、英: Dynamic Programming, DP)は、計算機科学の分野において、アルゴリズムの分類の1つである。対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法を総称してこう呼ぶ。 定義[編集] 細かくアルゴリズムが定義されているわけではなく、下記2条件を満たすアルゴリズムの総称である。 帰納的な関係の利用:より小さな問題例の解や計算結果を帰納的な関係を利用してより大きな問題例を解くのに使用する。 計算結果の記録:小さな問題例、計算結果から記録し、同じ計算を何度も行うことを避ける。帰納的な関係での参照を効率よく行うために、計算結果は整数、文字やその組みなどを見出しにして管理される。 概要[編集] 「動的計画法(dynamic programming)」という言葉は1940年代にリチャード・E・ベルマンが最初に使いは

                                動的計画法 - Wikipedia
                              • 響け!動的計画法 (DP) 入門〜個人的まとめ

                                動的計画法(DP)の基礎知識から例題、考え方、解説コードまで記載した個人的メモ

                                  響け!動的計画法 (DP) 入門〜個人的まとめ
                                • アルゴリズムイントロダクション輪講 動的計画法の発表資料 - てっく煮ブログ

                                  2009年3月2日に、はてな京都オフィスで開催された アルゴリズムイントロダクション輪講 の第12回で「動的計画法」について発表しました。資料をここにおいておきます。View more presentations from nitoyon.分かりやすくしようと気合を入れてまとめたら165ページの大作になっちゃいました。無駄に長くてすいません。アルゴリズムの設計と解析手法 (アルゴリズムイントロダクション)作者: T.コルメン, R.リベスト, C.シュタイン, C.ライザーソン, Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, Charles E. Leiserson, 浅野哲夫, 岩野和生, 梅尾博司, 山下雅史, 和田幸一出版社/メーカー: 近代科学社発売日: 2007/03メディア: 単行本

                                  • 実用アルゴリズムの基礎「動的計画法」と機械学習の基礎「類似度」を知る

                                    実用的なソフトウエアを開発するにはアルゴリズムの知識は欠かせない。基礎から機械学習まで、厳選した10個のアルゴリズムをPythonによる実装とともに解説する。 [7 動的計画法] レーベンシュタイン距離 多くの人にとって、アルゴリズムの学習の最初の壁となるのが、「動的計画法」ではないでしょうか。動的計画法は、「問題の部分的な結果を記録・利用しながら、最終的な結果を求める」手法の総称です。クイックソートや深さ優先探索のような手法よりも、1 段か2段、抽象的な概念である点と、アルゴリズムを可視化しにくい点が、難しく感じる原因なのだと思われます。また、“動的計画法”という名称が内容に合っていないことも、動的計画法をわかりにくくしていると言えるでしょう。 しかし、多くの有用なアルゴリズムは動的計画法の手法を使っているので、避けて通ることはできません。 ここでは、動的計画法で「レーベンシュタイン距離

                                      実用アルゴリズムの基礎「動的計画法」と機械学習の基礎「類似度」を知る
                                    • 動的計画法の問題を機械的に解く方法 - yukobaのブログ

                                      情報オリンピックという中高生向けの競技プログラミングの大会があります。国内予選・選抜が3回あり、最後に世界大会があります。アルゴリズムの問題が出題されます。予選の毎年のパターンは問1, 2は問題文をコードに起すだけの問題で、問3はアルゴリズムの問題だったり、中学受験的な算数の問題だったりします。問4はいつも動的計画法の問題が出ます。競技プログラミングでは動的計画法が一番の入門であり、これがスタートラインです。これが解けないと始まりません。動的計画法の問題、機械的に解けるのかなと思い色々と考えたのですが、できそうなので、このブログ記事にまとめます。 動的計画法 動的計画法ですが、やはり一番しっかり書かれているのが、書籍「アルゴリズムイントロダクション」 http://www.amazon.co.jp/dp/476490408X です。動的計画法の章は熟読に値すると思います。「動的計画法」とい

                                        動的計画法の問題を機械的に解く方法 - yukobaのブログ
                                      • できる動的計画法:ロッド切り出し問題 | POSTD

                                        私が常に頭を悩まされていたのが最適化問題です。これは、コードを理解するだけでも非常に困難な問題です。そこで、これまでに私が学んだことを基に、典型的な動的計画法の問題を取り扱ういくつかの記事を投稿することにしました。今回取り上げるロッド切り出し問題は古典的な最適化問題であり、動的計画法の一例と言えます。 ロッド切り出し問題とは? ロッド切り出し問題は、現実世界で私たちが直面するたいていの問題に非常によく似ています。ある長さの棒があり、この棒を最大利益が得られる長さにして切り売りをしたいという状況があると仮定します。ここで問題となるのは、切り出した長さによって棒の値段が異なる点です。例えば細かく切り出した方が大まかに切り出した場合よりも、より多くの利益が得られる可能性があるため、ちょっと違った考え方をする必要があります。 先に進む前に、まずはこの問題をより正確に定義しておきましょう。 長さ n

                                          できる動的計画法:ロッド切り出し問題 | POSTD
                                        • 動的計画法は再帰で表せ

                                          動的計画法の説明は常に再帰関数で書き表すことにしています.いやゆるメモ化再帰です.参照透過な関数は,同じ引数に対して同じ値を返すので,保存しておけばいいという感覚です.計算量の見積もりも簡単で,引数の異なり数に関数中のループの上限をかければおしまいです.特に再帰で書くことに慣れていれば自明に書けますし,テーブルを使ったDPと違って,ループの順番を意識する必要がありません.このテクニックは学部時代に@ohkuraに教えてもらいました.関数型言語に触れた今でこそ当たり前に見えますが,当時は目から鱗だったのを覚えています. メモ化再帰と不動点に関する@kinabaさんの日記や,プログラミングコンテスト的には@chokudaiさんの記事が参考になります. 今更ですが,ちょっと例で説明します.フィボナッチ数を計算する関数fib(x)は再帰式で,fib(x) = fib(x - 1) + fib(x

                                          • 「サイゼリヤで1000円あれば最大何kcal摂れるのか」をTeX言語で計算する ~TeX言語で動的計画法(DP)~ - TeX Alchemist Online

                                            最近,巷では「サイゼリヤで1000円あれば最大何kcal摂れるのか」を計算するのが流行っているようです。 「サイゼリヤで1000円あれば最大何kcal摂れるのか」を量子アニーリング計算(Wildqat)で解いてみた。 - Qiita 「サイゼリヤで1000円あれば最大何kcal摂れるのか」をSMTソルバー(Z3)で解いてみた。 - Qiita 「サイゼリヤで1000円あれば最大何kcal摂れるのか」を整数計画法ソルバー(PuLP)で解いてみた。 - Qiita 「サイゼリヤで1000円あれば最大何kcal摂れるのか」をマルコフ連鎖モンテカルロで解いてみた。 - Qiita 「サイゼリヤで1000円あれば最大何kcal摂れるのか」をExcel のソルバーでで解いてみた。 - Qiita 【Excel】サイゼリヤ1000円で摂れるカロリーの最大値をVLOOKUP関数だけで求める方法 - わえな

                                              「サイゼリヤで1000円あれば最大何kcal摂れるのか」をTeX言語で計算する ~TeX言語で動的計画法(DP)~ - TeX Alchemist Online
                                            • 動的計画法(ナップサック問題) - アルゴリズム講習会

                                              動的計画法とナップサック問題について解説します。 動的計画法とは 直接計算すると大きな時間がかかってしまう問題に対し、途中の計算結果をうまく再利用することで計算効率を上げる手法のこと。 「途中の計算結果を再利用」=「同じ計算をしない」ということ 難しいように見えて考え方自体は単純 ICPC国内予選でもC問題~F問題くらいに何かしらの形で2,3題ほどでます 英語では「Dynamic Programming」と呼び、略して「DP」と呼ぶことが多いです。 動的計画法で効率的に解ける問題の一つに、ナップサック問題というものがあります。 ナップサック問題は、価値と重さが決まっている複数の品物を容量が一定のナップサックに詰め込むとき、ナップサックに詰め込める品物の価値の和の最大値は何であるか? という問題です。 具体的には、以下の図のようになります。ナップサックに書かれている「15kg」が容量で、周囲

                                                動的計画法(ナップサック問題) - アルゴリズム講習会
                                              • なぜ動的計画法はDynamic「Programming」という名前なのか - フリーランチ食べたい

                                                Coursera「Data Structures and Algorithms」 ここ1ヶ月半CourseraでCSのコースを受講しているのですが、そこで動的計画法についての面白い話があったのでシェア。 www.coursera.org 「Data Structures and Algorithms」という課程の中の「algorithmic-toolbox」コースWeek5のテーマが「動的計画法」です。 動的計画法(Dynamic Programming)とは まず前提として動的計画法とは何か?という話です。 Wikipediaより 動的計画法 - Wikipedia 計算機科学の分野において、アルゴリズムの分類の1つである。対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法を総称してこう呼ぶ。 細かくアルゴリズムが定義されているわけではなく、下記2条件

                                                  なぜ動的計画法はDynamic「Programming」という名前なのか - フリーランチ食べたい
                                                • Haskellで動的計画法を攻略する

                                                  Haskellで動的計画法を実装する2つの方法 出典: Easily Solving Dynamic Programming Problems in Haskell by Memoization of Hylomorphisms ザ圏論的やり方としては①Dynamorphism、手続き的な方法として②STモナドが挙げられる。 DynamorphismはHylomorphismをメモ化したようなもので、詳しくはlotz氏のサイトを参照してほしい。 Haskellerとしては、Dynamorphismはとても憧れる手法である。しかし、思ったよりも速度が出ない。。 このスクラップに二通りのLCSの解法を記載したが、いずれもTLEであった。 lotz氏によると、メモ化されたデータ構造にはO(n)でしかアクセスできないことが理由とのこと。 この記事では、STモナドによるメモ化再帰を用いた動的計画問題

                                                    Haskellで動的計画法を攻略する
                                                  • 動的計画法の実例: QRコードの最適なエンコードを求める - Qiita

                                                    はじめに 最近、実生活で競技プログラミングが役に立ちました。 趣味の一環で長方形のQRコードであるrMQRコードを生成するPythonパッケージを作成しています。その中で「ビット列が最も短くなるようにデータをエンコードする」という処理に動的計画法を用いました。大学時代に競技プログラミングをやっていた身としては「競プロが役に立った!」と嬉しかったので、実例として共有したくてこの記事を書いています。動的計画法のDPテーブルの定義から遷移のしかた、解の復元までを図や実装とともに説明しています。動的計画法自体は説明していません。実装の全体はこちらでご覧いただけます。 この記事に出てくるrMQRコードの仕様に関する記述はISO規格1に基づいています。最適なエンコードを求めるアルゴリズム自体は仕様に含まれるものではなく、オリジナルのものになります。 ※QRコードは(株)デンソーウェーブの登録商標です。

                                                      動的計画法の実例: QRコードの最適なエンコードを求める - Qiita
                                                    • 動的計画法高速化テクニック(オフライン・オンライン変換) - Qiita

                                                      以下の問題を考えます. 1次元の直線上に地点 $x[0] < x[1] < \cdots < x[n-1]$ がある.我々は車を用いて地点 $x[0]$ から地点 $x[n-1]$ まで移動したい.途中の地点で休憩することができるが,頻繁な休憩も過剰な運転も避けたいので,休憩を挟まずに移動する距離がおよそ $a$ 程度になるようにしたい.具体的には休憩を挟まずに距離 $b$ だけ移動したとき,ペナルティとして $(b - a)^2$ がかかるとし,全体のペナルティが最小になるように移動したい.どのようにすればよいか. この問題は以下の動的計画法 (Dynamic Programming; DP) で $O(n^2)$ 時間で解けます. $$ D(j) = \min \{ D(i) + (x[j] - x[i] - a)^2 : i \in [0,j) \}, \ \ (j \in [0,n

                                                        動的計画法高速化テクニック(オフライン・オンライン変換) - Qiita
                                                      • 動的計画法再入門(1) - nokunoの日記

                                                        プログラミングコンテストチャレンジブックを読みながら、動的計画法の復習をしています。プログラミングコンテストチャレンジブックこの本はコンテストの紹介とか環境構築の説明はほとんどなく、普通にアルゴリズムの教科書として優れているのでタイトルに騙されないようにしましょう(笑)。それはさておき、この記事ではp.52のナップサック問題を例に、動的計画法の考え方と実装方法について検討してみます。 ナップサック問題重さと価値がそれぞれw_i, v_iであるようなn個の品物があります。これらの品物から、重さの総和がWを超えないように選んだ時の、価値の総和の最大値を求めなさい。制約:1 1 1 <例>入力:n = 4(w, v) = {(2,3), (1,2), (3,4), (2,2)}出力:7 (0,1,3番の品物を選ぶ) 方法1最初に書いたコードがこれです。再帰による全探索で、荷物を左から順番に選んで

                                                        • ALGORITHM NOTE 動的計画法

                                                          n × n のマス目のそれぞれに 1 または 0 が記してあり、その中から 1 だけから成る最大の長方形の面積を求めて下さい。 これは前に考えた正方形探索の応用で、今回は最大の長方形を探します。この問題も正方形探索で用いたアルゴリズムを応用して動的計画法で解くことができますが、正方形探索ほど単純な式では解決できません。左上角から右下角に向かって個々の要素を計算していく過程で、既に計算された左と上の要素を利用していきますが、長方形探索の場合、W[i][j] の値はそこから左上方向に向かってできる正方形の辺の長さではなく、そこから左上方向に向かってできる全ての長方形の情報を記録する必要があります。このアルゴリズムの詳しい解説が、プログラム・プロムナードに掲載されています。このアルゴリズムは、現在の要素を求めるために重複を避けながら左と上の要素をマージしたりと、プログラムがやや複雑になります。

                                                          • 意外と解説がない!動的計画法で得た最適解を「復元」する一般的な方法 - Qiita

                                                            NTTデータ数理システムでアルゴリズムを探求している大槻 (通称、けんちょん) です。 好きなアルゴリズムは最小カットやマッチングですが、会社ではなぜか「動的計画法が好きな人」と呼ばれています。今回は動的計画法を用いて得られた最適解を復元するための汎用的な方法について紹介します。 0. はじめに 動的計画法を用いて効率的に解くことのできる最適化問題は数多くあります。パッと思いつくだけでも ナップサック問題 迷路などの最短路問題 区間スケジューリング問題 音声認識パターンマッチング問題 レーベンシュタイン距離 発電計画問題 分かち書き 隠れマルコフモデル ... などなど、多種多様な分野の問題を動的計画法によって効率よく解くことができます。このように、分野横断的な活用をできることが、動的計画法をはじめとした数理工学的手法の特長であり醍醐味であると常々感じています。今回は動的計画法によって得ら

                                                              意外と解説がない!動的計画法で得た最適解を「復元」する一般的な方法 - Qiita
                                                            • 動的計画法解説 [TopCoder SRM 468 Div2 250/Div1 500]

                                                              動的計画法解説 [SRM 468 Div2 250/Div1 500] 目次 問題1(入門編) 全探索 再帰と漸化式 メモ化再帰 動的計画法 問題2(初級~中級編) 全探索 再帰と漸化式 動的計画法 問題1 王様は長い間出張していたので、できるだけ早く女王のもとに帰りたいと思っています。王様は都市 0 におり、女王は都市 N (1 <= N <= 50)に居ます。全ての都市 i (0 <= i <= N - 1) に対して陸路と空路があります。配列 roadTime, flightTime が与えられ、それぞれの i 番目の要素は都市 i から都市 i + 1 までの陸路、空路の所要時間 (1 以上 1000 以下) を表わします。しかし王国の科学力は低く、空路による移動は墜落の危険を伴います。そのため、王女は王様に空路は K (0 <= K <= N) 回までに留めるように言いました。王

                                                              • Haskell で動的計画法を書くための3つの方針 - tosの日記

                                                                アルゴリズムの代表っぽい存在とも言えるDPですが,Haskellは参照透明なので書きにくいと思われがちです. しかし,実際は,C言語やSTLなしのC++より遥かに簡単に動的計画法が書けます. リストを用いる 最初に知るであろう方法. フィボナッチ数列の第100項だと, let f = 0 : 1 : zipWith (+) a (tail a) in f!!100 です. 「ずらして足したものを後ろにつなげる」と言えばいいのでしょうか. これについては,他でよく解説されているので詳しくは説明しません. 利点: リストの知識のみでよい. 無限リストの恩恵が受けられる. importが不要. 欠点: 使えるケースが限られる. 書くときに,混乱することも(上の例だと,と考える必要がある. ランダムアクセスができないので,場合によってはO(n)倍の時間がかかる*1. 添字を自由に用いることができな

                                                                  Haskell で動的計画法を書くための3つの方針 - tosの日記
                                                                • 動的計画法入門(数え上げ) - ペケンペイのブログ

                                                                  数え上げ系の DP について説明する。 この記事は DP 初心者を対象にしている。DP やるだけみたいなことを一度でも考えたことがある人は対象にしていない。 例題 次の問題を考えてみよう。 N 桁以下の 3 の倍数はいくつあるか。 N が小さければ全列挙できる。i 桁の数がすべて列挙できていれば、その後ろに 0~9 を付け足せば i+1 桁の数をすべて列挙できることを使う。 dp[i] := leading zero を含めて i 桁のすべての非負整数の集合 #include <iostream> #include <string> #include <vector> using namespace std; int modulo(string s, int mod) { int ret = 0; for (char c : s) ret = (ret * 10 + (c - '0'))

                                                                    動的計画法入門(数え上げ) - ペケンペイのブログ
                                                                  • 力づく法・分割統治法・動的計画法 - アルゴリズム学習(その5) - $shibayu36->blog;

                                                                    アルゴリズムの設計手法として、力ずく法・分割統治法・動的計画法というような考え方があった。新しいアルゴリズムを学ぶ時、どの設計手法でやっているのだろうかと意識しておくと、頭に入りやすい気がした。そこで、自分の頭を整理するためにメモを書いておく。自分用メモなので、情報の正確さについては保証がない。 力づく法 全探索する方法 アルゴリズムの考え方としては単純なことが多いが、かなり遅いものになることが多い 例えば、Nクイーンなら、N個の置き方を全通り作って、それぞれが条件をみたすか確認し、条件を満たしたら返すようなもの。Nの二乗のなかから、N個の組み合わせを作って試すので、計算が膨大になる 例えば文字列マッチなら、1文字ずつずらしながら、マッチさせたいパターンとテキストの文字を比較していくようなもの 分割統治法 Wikipediaによると、そのままでは解決できない大きな問題を小さな問題に分割し、

                                                                      力づく法・分割統治法・動的計画法 - アルゴリズム学習(その5) - $shibayu36->blog;
                                                                    • 01ナップサック問題を動的計画法で解く場合の考え方

                                                                      重さの単位はkgで、問題の都合上整数です。 その他のツッコミどころとかはスルーでお願いします。 まずはとっかかりとなる考え方として、それぞれの品を持っていく/置いていくで場合分けをして総当りのグラフを書きましょう。 1つ目の品はカメラの三脚(3kg、7千円)です。 荷物が何もないところから始まって、三脚を持って行かない場合はそのまま、持っていく場合はその分の重さと価値を足します。 次の品物は手提げ金庫(2kg、4千円)です。 総当りということで、場合分けの数は倍々に増えていきます。 次の品物はゲーム機(2kg、8千円)です。 また前の品物の倍のノードが追加されました。 図でこれ以上描くのは面倒ですね。 面倒かどうかはさておき、2の品数乗のノードが必要になるというのは性能的に問題があります。 例題は6個なので26+25+24...程度のノードしか使いませんが、品数が100個の場合2100+.

                                                                      • Dynamorphism 〜 Haskellでも動的計画法がしたい! 〜 : 東京工業大学 ロボット技術研究会

                                                                        12月20 Dynamorphism 〜 Haskellでも動的計画法がしたい! 〜 カテゴリ:プログラミング言語AI研 この記事は rogy Advent Calenderの20日目の記事です また、この記事の単体のHTMLファイルがあります。 単体のHTMLファイルの方がスタイルが良い感じになっているので、出来ればそちらを読んでください。 1. はじめに1.1. まえがき この記事では、関数型プログラミングにおいて動的計画法(Dynamic Programming)を行う手法の一つである dynamorphism について解説します。 しかし、dynamorphism という概念はそれ単体で説明できるものではなく、F-代数 や catamorphism, anamorphism, hylomorphism, histmorphism などの各種概念を用いないと説明できないものです。そこ

                                                                          Dynamorphism 〜 Haskellでも動的計画法がしたい! 〜 : 東京工業大学 ロボット技術研究会
                                                                        • 動的計画法(Dynamic Programming)をサルでも分かるように説明する - その1(フィボナッチ数列)

                                                                          「動的計画法(Dynamic Programming、以下 DP)をどんな人にも分かるように丁寧に解説する」というこれまで何人もの優秀な方々が挑戦した内容にあえてまた参戦することにした。 「動的計画法」とか「Dynamic Programming」でググると山のように解説ページがヒットする。お決まりのセリフは「とてもカンタン」「誰にでも分かる!」しかし実情は難しいし、どの解説を読んでも「カンタンじゃねーよ」と思ってしまう。その理由について以下の仮説をたてた。 解説を書いている人は DP をカンタンに理解できるほど頭がいい頭が良すぎて「読んでも分からない人の気持ち」が分からない解説を読んで「オレならもっとカンタンに説明できるゼ!」という人が現れるそんな人もやっぱり頭がいいので1に戻る以下、無限ループの繰り返しで、世の中に DP の解説が溢れるこれは DP の解説があり過ぎるからもう要らないの

                                                                            動的計画法(Dynamic Programming)をサルでも分かるように説明する - その1(フィボナッチ数列)
                                                                          • 「典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~ 」をPythonで解く - u++の備忘録

                                                                            2月下旬に「典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~ 」の前半7問をPythonで解きました。ABCのD問題で時折出題されるDPの感覚をザックリと掴むことができました。 qiita.com 1 ナップサック DP とは 問題 1: 最大和問題 2 ナップサック問題 問題 2: ナップサック問題 3 部分和問題とその応用たち 問題 3: 部分和問題 問題 4: 部分和数え上げ問題 問題 5: 最小個数部分和問題 問題 6: K個以内部分和問題 問題 7: 個数制限付き部分和問題 1 ナップサック DP とは 問題 1: 最大和問題 n = int(input()) a = list(map(int, input().split())) # input # == # 3 # 7 -6 9 # == # dp[0] = 0 dp = [0]

                                                                              「典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~ 」をPythonで解く - u++の備忘録
                                                                            • Java 動的計画法でフィボナッチ数列を高速に求めてみた | ぶろぶろ!

                                                                              こんばんは、すずしんです。 以前、「Java フィボナッチ数列を求めるプログラムを書いてみた」という記事をきっかけにして、フィボナッチ数列の要素を求めるプログラムを作成してみました。 そして、「Java フィボナッチ数列を求めるプログラムを高速化してみた」という記事では、HashMapを使うことで高速にフィボナッチ数列の計算を行えるようにしました。 この度、フィボナッチ数列の要素を求めるにあたって、「動的計画法」と呼ばれる方法でプログラムを新たに作成して動作チェックしてみました。 すると、実装がシンプルなのにも関わらず、非常に高速に要素の値を求めることができることが分かりました。 今回の記事では、その動的計画法で作成したプログラムについて紹介したいと思います。 フィボナッチ数列とは? フィボナッチ数列というのは、「前の2つの数を加えると次の数になる」数列のことを言います。 ただし、

                                                                                Java 動的計画法でフィボナッチ数列を高速に求めてみた | ぶろぶろ!
                                                                              • マニアック動的計画法特集 - めも帳

                                                                                2013-12-12 マニアック動的計画法特集 この記事は Competitive Programming Advent Calendar Div2013(http://partake.in/events/3a3bb090-1390-4b2a-b38b-4273bea4cc83) の12日目の記事です。 マニアックな動的計画法(Dynamic Programming, 以下DPと表記)手法についての記事です。 「DP知ってるけど苦手だわ〜」って方は8日目の診断人さんの記事必見です!(http://d.hatena.ne.jp/shindannin/20131208/1386512864) 前書き DPとはなにか、一言でいうと「手法」だと思います。 二分探索や貪欲法と同じようにいろいろな問題に適用できる「手法」であり、 なにかひとつの「アルゴリズム」ではありません。 そういう訳

                                                                                  マニアック動的計画法特集 - めも帳
                                                                                • うさぎでもわかるアルゴリズム 動的計画法

                                                                                  こんにちは、ももやまです。 動的計画法は、アルゴリズムでもかなり重要な内容です。AtCoderやらプログラミングコンテストとかでもよく出てきます。 ですが、動的計画法は「アルゴリズムを学ぶ上での壁・登竜門」とも呼ばれるとおり、かなり難易度の高いアルゴリズムとなっています。どの参考書を見てもなかなかわかりやすくは書かれていません。 そんな動的計画法を今回はうさぎでもわかるようにわかりやすくかみ砕いて説明したいと思います。 1.動的計画法とは 動的計画法とは、 問題をいくつかの簡単で小さな問題に分割 それぞれの問題の計算結果を表に記録 同じ問題に対しては表から計算結果を参照する の3つの特徴を持ったアルゴリズムです。 といきなり言われてもわけがわからないと思うので、動的計画法のイメージを説明しましょう。 動的計画法のイメージ 例えば、\[ 28 \times 37 \]の計算を解きなさい。 と

                                                                                    うさぎでもわかるアルゴリズム 動的計画法