atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
早稲田大学チームvivid_turtle 知見共有@ ウィキ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
早稲田大学チームvivid_turtle 知見共有@ ウィキ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
早稲田大学チームvivid_turtle 知見共有@ ウィキ
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • 早稲田大学チームvivid_turtle 知見共有@ ウィキ
  • 文字列と動的計画法

早稲田大学チームvivid_turtle 知見共有@ ウィキ

文字列と動的計画法

最終更新:2019年09月15日 23:50

vivid_turtle

- view
だれでも歓迎! 編集
文字列は動的計画法で数え上げなどの題材とされることが多い。蟻本にもそれのページがある。
ここでは、蟻本にないはずの自分で見つけた知見を書く。

文字列の動的計画法のテーブルの定義


文字列の動的計画法のテーブルの定義は、dp[i]などをi文字目を使用した時の〇〇〇〇、とするとうまくいきやすい!

蟻本にある例だけど、LCSの動的計画法のテーブルの定義も、dp(i, j) := Sのi文字目とTのj文字目まで使った時の最長であり、dp(k, l)(1 <= k <= i ,1 <= l <= j)までのすべてのベスト、という着眼点よりはこの定義の方がうまくいきやすいと思う。

最も、LCSの場合は前者は後者を含み、蟻本もその前提に立ってコードを書いてる。後者のような考え方を取らない場合は、二次元累積和配列を用意する必要がある。
認識としては、前者が普通で、LCSがたまたま後者にしても問題ない上に実装が楽になった、と考えたい。

例 ABC130 E(500) Common Subsequence


https://atcoder.jp/contests/abc130/tasks/abc130_e

この場合、
dp(i, j) := Sのi文字目、Tのj文字目を最後尾として作れる共通部分列の場合の数
とするとうまくいく。動的計画法では珍しく、その状態のみをピンポイント指し、それ以外を含むということはない。
遷移としては、S(i) != T(j)は当然0となる。S(i) == T(j)ならば、dp(a, b)(ただし、a, bはそれぞれi - 1, j - 1まで計(i - 1) * (j - 1)通りすべて)の総和となる。これはSのi - 1文字目,Tのj - 1文字目までのすべての部分列と定義できる。それに最後にSもTにもあるS[i]とT[j]を足せば、新しい文字列となる。
また、今までの文字列を採用せず、S[i]のみで構成することも可能で、これは1通り。
之の実装で、上記の二次元累積和を使用すれば高速に更新できるので、この定義特有のデータ更新時のデータ取得の難しさを解決できる。

例 ABC141 E(500) Who Says a Pun?


https://atcoder.jp/contests/abc141/tasks/abc141_e

この問題自体は、ローリングハッシュ、Z-algorithmでも解ける。それは次のページを参照してほしい。

ローリングハッシュ

Z-algorithm


この問題の計算量は2乗を許容しており、これを考えると、DPを少し考えたくなる。上の内容を踏まえたDPを考えると、次のような定義を思いつく。

dp(i, j) := i番目文字とj番目の文字を最後尾としたときの連続部分列の長さの最大

これを思いつけば更新式も難しくはない。
dp(i, j) = 0 (if S[i] != S[j])
= min(dp(i - 1, j - 1) + 1, j - i)

最後のminの意味は、これはあくまで[i, j]の範囲内での連続部分列の最大の長さであり、長さをj - iに最大でも抑える必要がある。
次のように、
aaaaaaaaaaaaaa
    ^  ^
    |  |
    i  j
 
でも、その添え字ではj - i個の長さまでしか見ておらず、最終的な答えに相当するもっと長いのはほかのもっとj - i大きい区間のDPの計算でわかる。

タグ:

+ タグ編集
  • タグ:
タグの更新に失敗しました
エラーが発生しました。ページを更新してください。
ページを更新
「文字列と動的計画法」をウィキ内検索
LINE
シェア
Tweet
早稲田大学チームvivid_turtle 知見共有@ ウィキ
記事メニュー

メニュー

  • トップページ
  • プラグイン紹介
  • メニュー
  • 右メニュー
  • アルゴリズム別知見
  • 個別問題知見



リンク

  • @wiki
  • @wikiご利用ガイド




ここを編集
記事メニュー2

更新履歴

取得中です。


ここを編集
人気記事ランキング
  1. bitsetでの定数倍改善
  2. ダブリングの使い所さん
  3. アルゴリズム別知見
  4. しゃくとりの大原則
  5. 素数modの世界
  6. 中央値と二分探索
もっと見る
最近更新されたページ
  • 1546日前

    bitsetでの定数倍改善
  • 2159日前

    しゃくとりの大原則
  • 2159日前

    アルゴリズム別知見
  • 2162日前

    グリッド上の構築
  • 2163日前

    ARC096-D
  • 2163日前

    ARC092-D
  • 2163日前

    個別問題知見
  • 2167日前

    ダブリングの使い所さん
  • 2173日前

    文字列と動的計画法
  • 2173日前

    数え上げのDPのさまざま(知らなかったこと)
もっと見る
人気記事ランキング
  1. bitsetでの定数倍改善
  2. ダブリングの使い所さん
  3. アルゴリズム別知見
  4. しゃくとりの大原則
  5. 素数modの世界
  6. 中央値と二分探索
もっと見る
最近更新されたページ
  • 1546日前

    bitsetでの定数倍改善
  • 2159日前

    しゃくとりの大原則
  • 2159日前

    アルゴリズム別知見
  • 2162日前

    グリッド上の構築
  • 2163日前

    ARC096-D
  • 2163日前

    ARC092-D
  • 2163日前

    個別問題知見
  • 2167日前

    ダブリングの使い所さん
  • 2173日前

    文字列と動的計画法
  • 2173日前

    数え上げのDPのさまざま(知らなかったこと)
もっと見る
ウィキ募集バナー
急上昇Wikiランキング

急上昇中のWikiランキングです。今注目を集めている話題をチェックしてみよう!

  1. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  2. 発車メロディーwiki
  3. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  4. ジョジョの奇妙な冒険 7人目のスタンド使い攻略wiki
  5. ダイナマイト野球3D
  6. シュガードール情報まとめウィキ
  7. Rainbow Six:Siege WIKI
  8. オバマス検証@wiki
  9. ゆっくり虐め専用Wiki
  10. EDF4.1:地球防衛軍4.1 THE SHADOW OF NEW DESPAIR @Wiki
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  8. 発車メロディーwiki
  9. オレカバトル アプリ版 @ ウィキ
  10. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
もっと見る
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MadTown GTA (Beta) まとめウィキ
  2. まどドラ攻略wiki
  3. シュガードール情報まとめウィキ
  4. R.E.P.O. 日本語解説Wiki
  5. Dark War Survival攻略
  6. SurrounDead 攻略 (非公式wiki)
  7. ソードランページ @ 非公式wiki
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. カツドンチャンネル @ Wiki
  10. AviUtl2のWiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. サーバールール - ストグラ まとめ @ウィキ
  3. エスターク・Z・ダークネス - ストグラ まとめ @ウィキ
  4. MOZU - ストグラ まとめ @ウィキ
  5. NO LIMIT - ストグラ まとめ @ウィキ
  6. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  7. 我孫子 清十郎 - ストグラ まとめ @ウィキ
  8. Super Subaru - ストグラ まとめ @ウィキ
  9. 暦家 - ストグラ まとめ @ウィキ
  10. アプリコット - ストグラ まとめ @ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.