Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AOJ 0022 Maximum Sum Sequence 解説
Search
kagamiz
March 30, 2013
Programming
1
1.5k
AOJ 0022 Maximum Sum Sequence 解説
OkNCT-ICT 2013 春合宿 Day 6 (らしい) に解説したもの.
kagamiz
March 30, 2013
Tweet
Share
More Decks by kagamiz
See All by kagamiz
KCS v2. の開発
kagamiz
0
240
internship final presentation
kagamiz
0
1.2k
internship-middle term presentation
kagamiz
0
1k
すうがくのまほう
kagamiz
0
330
ご当地料理の紹介
kagamiz
0
380
オンラインジャッジシステムの実装
kagamiz
0
1.2k
AOJ 0557 A First Grader 解説
kagamiz
0
970
JOI2013 本選1 Illumination 解説
kagamiz
0
330
AOJ 0186 Aizu Chicken 解説
kagamiz
0
290
Other Decks in Programming
See All in Programming
20250326_生成AIによる_レビュー承認システムの実現.pdf
takahiromatsui
17
5.3k
Windows版PHPのビルド手順とPHP 8.4における変更点
matsuo_atsushi
0
360
プログラミング教育のコスパの話
superkinoko
0
120
爆速スッキリ! Rspack 移行の成果と道のり - Muddy Web #11
dora1998
1
150
いまさら聞けない生成AI入門: 「生成AIを高速キャッチアップ」
soh9834
12
3.6k
Coding Experience Cpp vs Csharp - meetup app osaka@9
harukasao
0
110
Devinのメモリ活用の学びを自社サービスにどう組み込むか?
itarutomy
0
1.6k
PHPでお金を扱う時、終わりのない 謎の1円調査の旅にでなくて済む方法
nakka
3
990
Go1.24で testing.B.Loopが爆誕
kuro_kurorrr
0
150
Gunma.web #55
tinykitten
0
130
Return of the Full-Stack Developer
simas
PRO
1
310
複雑なフォームと複雑な状態管理にどう向き合うか / #newt_techtalk vol. 15
izumin5210
4
2.8k
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
Faster Mobile Websites
deanohume
306
31k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Building an army of robots
kneath
304
45k
Product Roadmaps are Hard
iamctodd
PRO
52
11k
Automating Front-end Workflow
addyosmani
1369
200k
GitHub's CSS Performance
jonrohan
1030
460k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
28
2k
Unsuck your backbone
ammeep
670
57k
It's Worth the Effort
3n
184
28k
Code Review Best Practice
trishagee
67
18k
Transcript
AOJ 0022 Maximum Sum Sequence 解説 @kagamiz
www.company.com 問題概要 • 長さがn の数列が与えられます. • 連続する1 個以上の項の和の最大値を求めてください. • n
≦ 5000 (Challenge ケースではn ≦ 10^6) • |ai| ≦ 100000
www.company.com 入力例の解析 • n = 7 数列 = {-5 -1 6 4 9 -6 -7} •
赤の部分列を選ぶと最適で, 和は19 になる. {-5 -1 6 4 9 -6 -7}
www.company.com 入力例の解析 • n = 13 数列 = {1 2 3 2 -2 -1 1 2 3 2 1 -2 1} •
赤の部分列を選ぶと最適で, 和は14 になる. {1 2 3 2 -2 -1 1 2 3 2 1 -2 1}
www.company.com 入力例の解析 • n = 3 数列 = {1000 -200 201} •
赤の部分列を選ぶと最適で, 和は1001 になる. {1000 -200 201}
www.company.com O(n^3) 解法 • すべての区間を試す. • 区間は左と右を決めれば一意に定まる ← O(n^2) 個
• 左から右までをfor 文で和を取る ← O(n)時間 • こうして調べた和の中の最大値が答え. • n ≦ 200 までならOK.
www.company.com O(n^2) 解法 • O(n^3) 解法の何が無駄だったか? • どの区間が最大になるかはよく分からないか ら、O(n^2) 個すべてを試したい.
• “左から右までをfor 文で和を取る ← O(n)時間” • これを高速にしよう
www.company.com O(n^2) 解法 • 累積和配列の利用. • S[i] = a[1] +
a[2] + … + a[i] という配列を用意. • S[1] から順番に計算するとO(n) 時間で構築できる. • 区間[l, r] の和はS[r] – S[l – 1] で求まる. • よって, 2 重ループがもっとも重くO(n^2) 時間となる. • n ≦ 5000 までならOK.
www.company.com O(n) 解法 • Challenge ケースでも満点を取るためにはどうすれば 良いか? → 動的計画法の利用. •
dp[i] : 区間[x, i]での部分列の和の最大値(a[i] は必ず含 む)とすると, dp[i] = max(dp[i – 1] + a[i], a[i]) となる. • 答えはdp[i] の最大値. • 今までの最大値を利用するか, 自分から始めるか.
www.company.com O(n) 解法 • n = 13 数列 = {1 2 3 2 -2 -1 1 2 3 2 1 -2 1}
dp[i]= {1 3 6 8 6 5 6 8 11 13 14 12 13} • これは, for 文で最初から計算すると線形時間で求まる. • これで, Challenge ケースでも満点が取れる! • お疲れ様でした.