Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Dynamic Programming 1
Search
Suikaba
October 09, 2019
Programming
670
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dynamic Programming 1
動的計画法入門 その1
2019/10/09 に KCPC で発表した内容
Suikaba
October 09, 2019
Other Decks in Programming
See All in Programming
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
2
540
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
130
ChromeでローカルLLM
ryu1013
0
140
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
170
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.5k
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
The Rails Doctrine Decade
koic
2
590
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
190
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
0
880
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
187
23k
Side Projects
sachag
456
43k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
Ruling the World: When Life Gets Gamed
codingconduct
0
400
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
270
Mind Mapping
helmedeiros
1
400
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
600
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Transcript
DP (Dynamic Programming, ಈతܭը๏) 1 KCPC div2 ߨ࠲ ˏ suibaka
2019/10/09 1
DP ͱͳʹ͔ • ΛΑΓʮখ͍͞αΠζͷ෦ʹׂʯ͠ɺͦΕΒ෦ Λղ͍ͨ݁ՌΛʮهʯ͠ͳ͕ΒܭࢉΛਐΊ͍ͯ͘ख๏ • ه͢Δ͜ͱΛϝϞԽͱ͍ͬͨΓ͢Δ • dijkstra ๏ͷΑ͏ʹɺܾ·ͬͨखଓ͖͕͋ΔΘ͚Ͱͳ͍
• ͔ͩΒ͍ͦ͜͠ 2
ߟ͑ํ 1ɿܭࢉ݁ՌΛϝϞ͢Δ ྫɿϑΟϘφον ϑΟϘφονͷୈ n ߲ Fn ΛٻΊΑ • ͜ͷΛ్தܭࢉΛϝϞԽͤͣʹղ͘ͱʜ
• F5 ΛٻΊ͍ͨ 3
ߟ͑ํ 1ɿܭࢉ݁ՌΛϝϞ͢Δ ྫɿϑΟϘφον ϑΟϘφονͷୈ n ߲ Fn ΛٻΊΑ • ͜ͷΛ్தܭࢉΛϝϞԽͤͣʹղ͘ͱʜ
• F5 ΛٻΊ͍ͨ • F5 = F3 + F4 ͔ͩΒ F3 Λܭࢉ͠Α͏ 3
ߟ͑ํ 1ɿܭࢉ݁ՌΛϝϞ͢Δ ྫɿϑΟϘφον ϑΟϘφονͷୈ n ߲ Fn ΛٻΊΑ • ͜ͷΛ్தܭࢉΛϝϞԽͤͣʹղ͘ͱʜ
• F5 ΛٻΊ͍ͨ • F5 = F3 + F4 ͔ͩΒ F3 Λܭࢉ͠Α͏ • F3 = F2 + F1 ͔ͩΒɺ͜Ε͙͢ʹ͔ͬͯ F3 = 2 3
ߟ͑ํ 1ɿܭࢉ݁ՌΛϝϞ͢Δ ྫɿϑΟϘφον ϑΟϘφονͷୈ n ߲ Fn ΛٻΊΑ • ͜ͷΛ్தܭࢉΛϝϞԽͤͣʹղ͘ͱʜ
• F5 ΛٻΊ͍ͨ • F5 = F3 + F4 ͔ͩΒ F3 Λܭࢉ͠Α͏ • F3 = F2 + F1 ͔ͩΒɺ͜Ε͙͢ʹ͔ͬͯ F3 = 2 • F3 ͕ٻ·ͬͨͧʂ࣍ F4 ΛٻΊΑ͏ 3
ߟ͑ํ 1ɿܭࢉ݁ՌΛϝϞ͢Δ ྫɿϑΟϘφον ϑΟϘφονͷୈ n ߲ Fn ΛٻΊΑ • ͜ͷΛ్தܭࢉΛϝϞԽͤͣʹղ͘ͱʜ
• F5 ΛٻΊ͍ͨ • F5 = F3 + F4 ͔ͩΒ F3 Λܭࢉ͠Α͏ • F3 = F2 + F1 ͔ͩΒɺ͜Ε͙͢ʹ͔ͬͯ F3 = 2 • F3 ͕ٻ·ͬͨͧʂ࣍ F4 ΛٻΊΑ͏ • F4 = F3 + F2 ͔ͩΒɺF3 Λܭࢉ͠ͳ͍ͱ 3
ߟ͑ํ 1ɿܭࢉ݁ՌΛϝϞ͢Δ ྫɿϑΟϘφον ϑΟϘφονͷୈ n ߲ Fn ΛٻΊΑ • ͜ͷΛ్தܭࢉΛϝϞԽͤͣʹղ͘ͱʜ
• F5 ΛٻΊ͍ͨ • F5 = F3 + F4 ͔ͩΒ F3 Λܭࢉ͠Α͏ • F3 = F2 + F1 ͔ͩΒɺ͜Ε͙͢ʹ͔ͬͯ F3 = 2 • F3 ͕ٻ·ͬͨͧʂ࣍ F4 ΛٻΊΑ͏ • F4 = F3 + F2 ͔ͩΒɺF3 Λܭࢉ͠ͳ͍ͱ • F3 ͬͯͳΜ͚ͩͬɺ͔͍ͬܭࢉ͢Δ͔ʜ 3
ߟ͑ํ 1ɿܭࢉ݁ՌΛϝϞ͢Δ ιʔείʔυ 1: ϝϞԽ͠ͳ͍ϑΟϘφονͷܭࢉ 1 int fib(int n) {
2 if(n == 1 || n == 2) return 1; 3 return fib(n - 1) + fib(n - 2); 4 } • ܭࢉྔ O (( 1 + √ 5 2 )n ) 4
ߟ͑ํ 1ɿܭࢉ݁ՌΛϝϞ͢Δ • ಉ͡ n ʹର͢Δ Fn ͷ݁Ռಉ͡ • ໌Β͔ʹɺҰܭࢉͨ͠Β͏Ұܭࢉ͢Δඞཁͳ͍
• ͜Ε͕ϝϞԽͱ͍͏ߟ͑ํ • ؆୯Ͱ͠ΐ͏ʁ • ୯७ͳൃ͕ͩڧྗ 5
ߟ͑ํ 1ɿܭࢉ݁ՌΛϝϞ͢Δ ιʔείʔυ 2: ϝϞԽͨ͠ϑΟϘφονͷܭࢉ 1 // f[i] ͋Β͔͡Ίͯ͢ -1
ͰॳظԽ͞Ε͍ͯΔͱ͢Δ 2 int fib(int n) { 3 if(n == 1 || n == 2) return 1; 4 if(f[n] != -1) { // աڈʹܭࢉͨ͜͠ͱ͕͋Δ 5 return f[n]; 6 } 7 f[n] = fib(n - 1) + fib(n - 2); 8 return f[n]; 9 } • ܭࢉྔ O(n) 6
ิɿϝϞԽҎ֎ͷΓํ • ϝϞԽͱ͍͏ൃͰͳ͘ɺԽࣜతʹΔํ๏͋Δ • ͲͪΒΛ࠾༻͖͔͢ʹґଘ͢Δ • ܭࢉྔ͕มΘͬͯ͠·͏͜ͱ͕͋Δ • ܭࢉྔ͕ಉ͡ͰɺબʹΑ࣮͕ͬͯ؆୯ʹͳΔ͜ͱ ιʔείʔυ
3: ԽࣜతͳϑΟϘφονͷܭࢉ 1 f[1] = f[2] = 1; 2 for(int i = 3; i <= n; ++i) { 3 f[i] = f[i - 1] + f[i - 2]; 4 } 7
༗໊ɿφοϓαοΫ φοϓαοΫ n ݸͷՙ͕͋Δɻi ൪ͷՙͷॏ͞ wi Ͱ͋ΓɺՁ vi Ͱ͋Δɻॏ͕͞ W
Λ͑ͳ͍Α͏ʹՙΛબΜͩͱ͖ͷɺՁ ͷ૯Λ࠷େԽͤΑɻ • 1 ≤ n ≤ 103 • 1 ≤ wi ≤ 103 • 1 ≤ vi ≤ 106 • 1 ≤ W ≤ 103 8
༗໊ɿφοϓαοΫ • DP ʹ׳Εͳ͍͏ͪɺ࠷ॳʹશ୳ࡧղΛߟ͑ΔͱΑ͍ ιʔείʔυ 4: φοϓαοΫʢશ୳ࡧղʣ 1 // ՙ
i ʹ͍ͯͯ͠ɺ ͋ͱ W ͚ͩՙΛ٧ΊΒΕΔ 2 int solve(int i, int W) { 3 if(i == n) return 0; 4 int res = 0; 5 if(W >= w[i]) { // i ൪ͷՙΛ͏ 6 res = solve(i + 1, W - w[i]) + v[i]; 7 } 8 // i ൪ͷՙΛΘͳ͍ 9 res = max(res, solve(i + 1, W)); 10 return res; 11 } 9
༗໊ɿφοϓαοΫ • ͜ͷ··ͩͱ O(2n) ͷܭࢉྔ • ֤ՙΛબͿબͳ͍ͷ 2 ௨Γ •
࣍ʹϝϞԽͰ͖ͳ͍͔ߟ͑Α͏ • solve(i, W) ͷҙຯΛߟ͑Δͱɺ͋Δ (i, W) ʹର͢Δܭࢉ݁ Ռৗʹಉ͡ • ϝϞԽ͕Ͱ͖Δʂ 10
༗໊ɿφοϓαοΫ ιʔείʔυ 5: φοϓαοΫʢϝϞԽʣ 1 // ՙ i ʹ͍ͯͯ͠ɺ ͋ͱ
W ͚ͩՙΛ٧ΊΒΕΔ 2 // dp[i][j] ࠷ॳ -1 ͰॳظԽ͞Ε͍ͯΔ 3 int solve(int i, int W) { 4 if(i == n) return 0; 5 if(dp[i][W] != -1) return dp[i][W]; 6 dp[i][W] = 0; 7 if(W >= w[i]) { // i ൪ͷՙΛ͏ 8 dp[i][W] = solve(i + 1, W - w[i]); 9 } 10 // i ൪ͷՙΛΘͳ͍ 11 dp[i][W] = max(dp[i][W], solve(i + 1, W)); 12 return dp[i][W]; 13 } 11
༗໊ɿφοϓαοΫ • ֤ (i, W) ʹରͯ͠ɺҰܭࢉͨ͠Β͏࠶ܭࢉ͞Εͳ͍ • ֤ (i, W)
ʹ͍ͭͯɺؔ෦Ͱ͍ͯ͠Δܭࢉఆճ • ΑͬͯܭࢉྔશମͰ O(nW) • ͨͬͨ͜Ε͚ͩՃ͢Δ͚ͩͰɺܶతʹܭࢉྔ͕มΘΔ 12
ߟ͑ํ 2ɿಉҰࢹͰ͖Δঢ়ଶΛ·ͱΊ্͛Δ • ͖ͬ͞ͷφοϓαοΫΛԽࣜతʹղ͍ͯΈΑ͏ • dp[i][j] := ՙ 1, .
. . , i ͔Βॏ͕͞ j ͱͳΔΑ͏ʹબΜͩͱ͖ ͷɺՁͷ࠷େ • ԽࣜͷભҠҎԼͷΑ͏ʹͳΔ dp[0][0] = 0 dp[i][j] = max{dp[i − 1][j], dp[i − 1][j − wi] + vi} 13
ߟ͑ํ 2ɿಉҰࢹͰ͖Δঢ়ଶΛ·ͱΊ্͛Δ • Ͳ͏ͯ͜͠ΕͰߴԽ͕Ͱ͖Δͷ͔ɺগ͠ҙຯΛߟ͑ͯΈΔ • dp[i][j] ͱՙ 1, . .
. , i ͔Βॏ͕͞ j ͱͳΔΑ͏ʹબΜͩঢ় ଶͰ͋Δ • ͜ͷΑ͏ͳબͼํɺෳଘࡏ͢ΔՄೳੑ͕͋Δ • w = 5 ͷͱ͖ʹɺॏ͞ 1, 4 ͷՙΛબΜͰྑ͍͠ɺॏ͞ 2, 3 ͷՙΛબΜͰྑ͍ • શ୳ࡧͱ͍͏ͷɺ͜ΕΒͯ͢ͷબͼํΛ۠ผͯ͠ߦ͏ͷ 14
ߟ͑ํ 2ɿಉҰࢹͰ͖Δঢ়ଶΛ·ͱΊ্͛Δ • dp[i][j] ΛԽࣜతʹղ࣌͘ɺ͜ΕΒͷ۩ମతͳબͼํͷใ མ͍ͪͯΔ • ॏཁͳͷɺॏ͞ͷͱͦͷ࣌ͷՁ (ͷ࠷େ) Ͱ͋ͬͯɺ
۩ମతͳબͼํͰͳ͍ͨΊɺ͜ͷΑ͏ͳ͜ͱ͕ڐ͞ΕΔ • ͜ͷΑ͏ʹɺDP Λߟ͑Δͱ͖ʹɺຊདྷ۠ผ͞Ε͍ͯͨঢ়ଶ Λ͕ղ͚ΔൣғͰ·ͱΊ্͛ɺঢ়ଶΛখ͘͢͞Δ 15
ࠓͷ·ͱΊ • DP ͱɺΛΑΓখ͍͞αΠζͷ෦ʹׂ͠ɺ్த ܭࢉΛه͠ͳ͕ΒղΛٻΊΔख๏ • 2 ͭͷجຊతͳߟ͑ํ • ܭࢉ݁ՌͷϝϞԽ
• ಉҰࢹՄೳͳঢ়ଶͷ·ͱΊ্͛Ͱঢ়ଶΛ͑Δ • Ͳ͏͍͏ঢ়ଶΛ·ͱΊ্͛ΒΕΔ͔Λߟ͑Δ͜ͱ͕େ • ٯʹݴ͑ɺམͱͯ͠ͳΒͳ͍ใͳʹ͔Λߟ͑Δ͜ͱ • ঢ়ଶɺDP ςʔϒϧͷఴࣈ࣋ͨͤΔͰදݱ͢Δ 16