SlideShare a Scribd company logo
1 of 27
Download to read offline
ABC025 解説
問題A – 25個の文字列
問題概要
• 長さ 5 の文字列 𝑆 と整数 𝑁 が与えられます。
• 𝑆 に含まれる文字を 2 回選び、長さ 2 の文字列を作成します。
• 考えられうる 25 通りの文字列のうち、辞書順で 𝑁 番目の文字列を
出力してください。
• 1 ≦ 𝑁 ≦ 25
• 𝑆 には 5 種類のアルファベットが使用されており、それらは昇順に並
んでいる。
解法
• 25 通りすべての文字列を生成し、ソートをすることで解くことができ
ます。
• ですが、実際にはソートしなくても答えを計算することができます。
• 答えの文字列を 𝑋 とし、𝑁 − 1 を 5 で割った商と余りをそれぞれ 𝐴 と
𝐵 としたとき、 𝑋 の 1 文字目は 𝑆 の 𝐴 + 1 文字目、 𝑋 の 2 文字目は
𝑆 の 𝐵 + 1 文字目となります (𝑆 内の文字は昇順に並んでいるため)。
問題B – 双子とスイカ割り
問題概要
• 𝑁 個の移動についての情報(東に 3 メートルとか西に 7 メートルとか)
が与えられます。
• 𝑁 個の移動後にどこにいるのかを計算してください。
• ただし、移動距離の指定が 𝐴 メートルより少ないなら 𝐴 メートルの移
動に、𝐵 メートルより多いなら 𝐵 メートルの移動に変更されます。
• 1 ≦ 𝑁 ≦ 100
• 1 ≦ 𝐴 ≦ 𝐵 ≦ 100
• 1 ≦ (指定距離) ≦ 100
解法
• 上から順にシミュレートします。
• 西方向へ 𝑋 メートル移動する処理を、東方向へ −𝑋 メートル移動す
るとして、現在位置も初期位置から東に 𝑌 メートル(初期位置よりも
西側なら 𝑌 は負の値になる)としておくことで、移動の処理が簡単に
なります。
問題C – 双子と○×ゲーム
問題概要
• 3×3 のマス目に交互に○と×を書いていきます。
• 全て埋まった後に、上下あるいは左右で隣接する 2 マスそれぞれに
ついて、同じ文字が書かれているか異なる文字が書かれているかを
判定し、同じなら直大くんに、異なるなら直子さんに得点が入ります。
• 両者が最善を尽くしたときのそれぞれの得点を計算してください。
• 1 ≦ 𝑏𝑖,𝑗 ≦ 100
• 1 ≦ 𝑐𝑖,𝑗 ≦ 100
方針
• 1 手目からいきなり 9 手目後の状態を考えるのは大変です。
• 逆に 9 手目から考えてみることにします。
• また、この問題の場合、直大くんの得点と直子さんの得点の合計値
は一定なので、直大くんは score=(直大くんの得点)-(直子さんの得
点)の最大化を、直子さんは score=(直大くんの得点)-(直子さんの得
点)の最小化を目標として行動するものとすれば、扱いが簡単になり
ます。
9 手目の状況
• 9 手目において、書くことのできる場所は 1 箇所しか無いので、書く
場所は一意に決まります。
ゲーム終了 : score=10
9手目 : score=?
マス (2,3) に書く
9 手目の状況(直大くんの手番)
• 9 手目において、書くことのできる場所は 1 箇所しか無いので、書く
場所は一意に決まります。
• そのため、9 手目の得点は、ゲーム終了時の得点と同じになります。
ゲーム終了 : score=10
9手目 : score=10
マス (2,3) に書く
8 手目の状況(直子さんの手番)
• 8 手目において、書くことのできる場所は 2 箇所あります。
• それぞれのマスについて、そこに×を置いた際に、9 手目以降がど
うなるかは、先ほどの情報より分かります。
8手目 : score=?
マス (1,1) に書く
9手目 : score=-209手目 : score=10
マス (2,3) に書く
8 手目の状況(直子さんの手番)
• 8 手目において、書くことのできる場所は 2 箇所あります。
• それぞれのマスについて、そこに×を置いた際に、9 手目以降がど
うなるかは、先ほどの情報より分かります。
• 直子さんは score を小さくしたいので、遷移可能な点のうち score が
最小な点に遷移すれば良いことになります。その値が 8 手目の
score となります。
8手目 : score=-20
マス (1,1) に書く
9手目 : score=-209手目 : score=10
マス (2,3) に書く
7 手目よりも前について
• 8 手目の score が分かるので、7 手目、6 手目、…とわかっていきます。
• 最終的に 1 手目において直大くんが置いたときの score が、両者が最善
を尽くしたときの score となります。
• まとめると、以下の再帰関数を実装すると解けます。
1. 現時点で置き場所がないなら、score を直接計算し返します。
2. すべての置き場所に対し、一旦置いてみることにします。
3. 置いた後の score をこの再帰関数を呼び出すことで計算します。
4. 直大くんの手番ならそれらの最大値を、直子さんの手番なら
それらの最小値を再帰関数の返り値とします。
備考
• この探索は、ゲーム木の探索です。
• 計算量は O(𝑁!) (𝑁 は手数)となります。
• 手数が少ないので、特に高速化しなくても計算量的には解けます。
• メモ化再帰をすることで O(2 𝑁
) にできます。
• ゲーム木の探索アルゴリズムなので、αβ枝刈りなどもできます。
問題D – 25個の整数
問題概要
• 1 から 25 までの整数を 5×5 の盤面に配置します。
• いくつかの整数はどこに置くか決まっています。
• 縦または横に連続する 3 整数をどのようにとってもそれらが昇順ま
たは降順になっていない置き方は全部で何通りあるか計算してくだ
さい。
• 少なくとも 5 つの整数は置き方が決まっている。
部分点解法 (30点)
• すべての置き方を試します。
• 置き方は 𝑁! 通り (𝑁 は空きマスの個数)あり、それぞれ O(𝑁2) で条
件を満たすかか判定できるので、計算量は O(𝑁2 ∗ 𝑁!) となります。
• 空きマスが少ないデータセット 1 なら高速で解けますが、空きマスが
多めのデータセット 2 だとかなりの時間がかかってしまいます。
考察
• 1 から順に置いていくことにします。
• この場合、どのような条件が満たされたら良くて、どのような条件が
満たされたらダメなのかを考えてみます。
考察
• 今新たに数を置くときに、上下または左右で隣接するマスについて
考えてみます (ここでは例として左右を考えます、上下も同様に処理
できます)。以下の 4 つの場合が考えられます。
• (A) : 左右のうち一方が盤面の外 (端のケース)
• (B) : 左右のうち両方が空きマス。
• (C) : 左右のうち一方が埋まっている。
• (D) : 左右のうち両方が埋まっている。
(B) 数 (C) 数 (D) 数(A)
考察
• (A)のケースは、条件に違反することはありません。
• (B)のケースは、今置く数を置いた時点では矛盾しません。真ん中が
最小値です。
• (C)のケースは、後で空いているマスにより大きい数を置くことになる
ので、この時点で矛盾していることが分かります。
• (D)のケースは今置く数を置いた時点では矛盾しません。真ん中が
最大値です。
(B) 数 (C) 数 (D) 数(A)
考察
• 先ほどの (C) を検出して除外するアルゴリズムだけで、すべての正し
い置き方を列挙することができるのでしょうか?
考察
• 先ほどの (C) を検出して除外するアルゴリズムだけで、すべての正し
い置き方を列挙することができるのでしょうか?
• →これできちんとチェックできます。なぜなら、連続する 3 マスについ
て、それらの大小関係はちょうど 2 個目が置かれたときに定まり、か
つダメなケースでは必ず (C) を経由することになるからです。
• 一方で(C)さえ経由しなければ最後まで置けた配置はいずれも条件
を満たします。
満点解法 (30+70点)
• もちろん先ほどのチェックを導入してもただすべての置き方をそのま
ま試すだけでは、結局 O(𝑁!) 通り見ることになります。
• 重要なこととして、先ほどのチェックに用いたのは、今現在置く数と
の大小関係のみなので、既に置いた数同士の大小関係は覚えなく
ても良いです。
• そのため、既に置いた場所の集合が同じ状態同士を一緒くたにして
計算することができます。
満点解法 (30+70点)
• ここで、bitDP と呼ばれるアルゴリズムを使用することができます。
• dp[i] = 今現在置かれている数字の配置が整数 i で表されるとき、現
時点で矛盾なく置かれている配置の総数。
• i は 25 ビットの非負整数で、盤面をビットで表します (例えば 10 マス
目が埋まっているなら第 10 ビットが 1 でそうでないなら第 10 ビット
が 0)。
• このとき、dp[i]= dp[i−2j−1] ∗ 𝑓(i−2j−1, j)25
j=1 となります。ただし、ここ
で 𝑓(i, j) は、i の第 j ビットが 0 であり、状態 i から新たに数を j マス
目においても矛盾しない場合に 1 を、それ以外の場合に 0 を返す関
数とします。また、dp[0]=1 とします。
満点解法 (30+70点)
• 先ほどの bitDP は O(2 𝑁) の計算量で動作します。
• 𝑁 ≦ 20 なので、データセット 2 でも速く動作します。

More Related Content

What's hot

Arc015途中まで解説
Arc015途中まで解説Arc015途中まで解説
Arc015途中まで解説AtCoder Inc.
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Inc.
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Inc.
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Inc.
 
AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Inc.
 
AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Inc.
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Inc.
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Inc.
 
AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Inc.
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Inc.
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Inc.
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Inc.
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Inc.
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Inc.
 
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Inc.
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Inc.
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 

What's hot (20)

Arc015途中まで解説
Arc015途中まで解説Arc015途中まで解説
Arc015途中まで解説
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 
AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説
 
AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説
 
AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説
 
Abc009
Abc009Abc009
Abc009
 
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 

Viewers also liked

AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Inc.
 
AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Inc.
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Inc.
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoder Inc.
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Inc.
 
競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回Hideaki Nagamine
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Inc.
 
競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回Hideaki Nagamine
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2AtCoder Inc.
 
競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回Hideaki Nagamine
 
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Inc.
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換AtCoder Inc.
 

Viewers also liked (18)

AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説
 
AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 
競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2
 
abc031
abc031abc031
abc031
 
競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回
 
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説
 
動的計画法
動的計画法動的計画法
動的計画法
 
最短経路問題 & 最小全域木
最短経路問題 & 最小全域木最短経路問題 & 最小全域木
最短経路問題 & 最小全域木
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換
 

Similar to AtCoder Beginner Contest 025 解説

Atcoder Regular Contest 014 解説
Atcoder Regular Contest 014 解説Atcoder Regular Contest 014 解説
Atcoder Regular Contest 014 解説光喜 濱屋
 
Kth
KthKth
Kthoupc
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説AtCoder Inc.
 
AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Inc.
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日nukaemon
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版Masami Yabushita
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかMasami Yabushita
 
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたものTakanori Fukui
 

Similar to AtCoder Beginner Contest 025 解説 (9)

Atcoder Regular Contest 014 解説
Atcoder Regular Contest 014 解説Atcoder Regular Contest 014 解説
Atcoder Regular Contest 014 解説
 
Kth
KthKth
Kth
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
Aizu-2017: B
Aizu-2017: BAizu-2017: B
Aizu-2017: B
 
AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
 
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
 

More from AtCoder Inc.

AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Inc.
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説AtCoder Inc.
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Inc.
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説AtCoder Inc.
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Inc.
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説AtCoder Inc.
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説AtCoder Inc.
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説AtCoder Inc.
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説AtCoder Inc.
 
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Inc.
 
天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説AtCoder Inc.
 

More from AtCoder Inc. (18)

TCO2017R1
TCO2017R1TCO2017R1
TCO2017R1
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
arc047
arc047arc047
arc047
 
abc032
abc032abc032
abc032
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説
 
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説
 
天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説
 

Recently uploaded

生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料Takayuki Itoh
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2Tokyo Institute of Technology
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ssusere0a682
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptyuitoakatsukijp
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 

Recently uploaded (7)

生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScript
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 

AtCoder Beginner Contest 025 解説

  • 3. 問題概要 • 長さ 5 の文字列 𝑆 と整数 𝑁 が与えられます。 • 𝑆 に含まれる文字を 2 回選び、長さ 2 の文字列を作成します。 • 考えられうる 25 通りの文字列のうち、辞書順で 𝑁 番目の文字列を 出力してください。 • 1 ≦ 𝑁 ≦ 25 • 𝑆 には 5 種類のアルファベットが使用されており、それらは昇順に並 んでいる。
  • 4. 解法 • 25 通りすべての文字列を生成し、ソートをすることで解くことができ ます。 • ですが、実際にはソートしなくても答えを計算することができます。 • 答えの文字列を 𝑋 とし、𝑁 − 1 を 5 で割った商と余りをそれぞれ 𝐴 と 𝐵 としたとき、 𝑋 の 1 文字目は 𝑆 の 𝐴 + 1 文字目、 𝑋 の 2 文字目は 𝑆 の 𝐵 + 1 文字目となります (𝑆 内の文字は昇順に並んでいるため)。
  • 6. 問題概要 • 𝑁 個の移動についての情報(東に 3 メートルとか西に 7 メートルとか) が与えられます。 • 𝑁 個の移動後にどこにいるのかを計算してください。 • ただし、移動距離の指定が 𝐴 メートルより少ないなら 𝐴 メートルの移 動に、𝐵 メートルより多いなら 𝐵 メートルの移動に変更されます。 • 1 ≦ 𝑁 ≦ 100 • 1 ≦ 𝐴 ≦ 𝐵 ≦ 100 • 1 ≦ (指定距離) ≦ 100
  • 7. 解法 • 上から順にシミュレートします。 • 西方向へ 𝑋 メートル移動する処理を、東方向へ −𝑋 メートル移動す るとして、現在位置も初期位置から東に 𝑌 メートル(初期位置よりも 西側なら 𝑌 は負の値になる)としておくことで、移動の処理が簡単に なります。
  • 9. 問題概要 • 3×3 のマス目に交互に○と×を書いていきます。 • 全て埋まった後に、上下あるいは左右で隣接する 2 マスそれぞれに ついて、同じ文字が書かれているか異なる文字が書かれているかを 判定し、同じなら直大くんに、異なるなら直子さんに得点が入ります。 • 両者が最善を尽くしたときのそれぞれの得点を計算してください。 • 1 ≦ 𝑏𝑖,𝑗 ≦ 100 • 1 ≦ 𝑐𝑖,𝑗 ≦ 100
  • 10. 方針 • 1 手目からいきなり 9 手目後の状態を考えるのは大変です。 • 逆に 9 手目から考えてみることにします。 • また、この問題の場合、直大くんの得点と直子さんの得点の合計値 は一定なので、直大くんは score=(直大くんの得点)-(直子さんの得 点)の最大化を、直子さんは score=(直大くんの得点)-(直子さんの得 点)の最小化を目標として行動するものとすれば、扱いが簡単になり ます。
  • 11. 9 手目の状況 • 9 手目において、書くことのできる場所は 1 箇所しか無いので、書く 場所は一意に決まります。 ゲーム終了 : score=10 9手目 : score=? マス (2,3) に書く
  • 12. 9 手目の状況(直大くんの手番) • 9 手目において、書くことのできる場所は 1 箇所しか無いので、書く 場所は一意に決まります。 • そのため、9 手目の得点は、ゲーム終了時の得点と同じになります。 ゲーム終了 : score=10 9手目 : score=10 マス (2,3) に書く
  • 13. 8 手目の状況(直子さんの手番) • 8 手目において、書くことのできる場所は 2 箇所あります。 • それぞれのマスについて、そこに×を置いた際に、9 手目以降がど うなるかは、先ほどの情報より分かります。 8手目 : score=? マス (1,1) に書く 9手目 : score=-209手目 : score=10 マス (2,3) に書く
  • 14. 8 手目の状況(直子さんの手番) • 8 手目において、書くことのできる場所は 2 箇所あります。 • それぞれのマスについて、そこに×を置いた際に、9 手目以降がど うなるかは、先ほどの情報より分かります。 • 直子さんは score を小さくしたいので、遷移可能な点のうち score が 最小な点に遷移すれば良いことになります。その値が 8 手目の score となります。 8手目 : score=-20 マス (1,1) に書く 9手目 : score=-209手目 : score=10 マス (2,3) に書く
  • 15. 7 手目よりも前について • 8 手目の score が分かるので、7 手目、6 手目、…とわかっていきます。 • 最終的に 1 手目において直大くんが置いたときの score が、両者が最善 を尽くしたときの score となります。 • まとめると、以下の再帰関数を実装すると解けます。 1. 現時点で置き場所がないなら、score を直接計算し返します。 2. すべての置き場所に対し、一旦置いてみることにします。 3. 置いた後の score をこの再帰関数を呼び出すことで計算します。 4. 直大くんの手番ならそれらの最大値を、直子さんの手番なら それらの最小値を再帰関数の返り値とします。
  • 16. 備考 • この探索は、ゲーム木の探索です。 • 計算量は O(𝑁!) (𝑁 は手数)となります。 • 手数が少ないので、特に高速化しなくても計算量的には解けます。 • メモ化再帰をすることで O(2 𝑁 ) にできます。 • ゲーム木の探索アルゴリズムなので、αβ枝刈りなどもできます。
  • 18. 問題概要 • 1 から 25 までの整数を 5×5 の盤面に配置します。 • いくつかの整数はどこに置くか決まっています。 • 縦または横に連続する 3 整数をどのようにとってもそれらが昇順ま たは降順になっていない置き方は全部で何通りあるか計算してくだ さい。 • 少なくとも 5 つの整数は置き方が決まっている。
  • 19. 部分点解法 (30点) • すべての置き方を試します。 • 置き方は 𝑁! 通り (𝑁 は空きマスの個数)あり、それぞれ O(𝑁2) で条 件を満たすかか判定できるので、計算量は O(𝑁2 ∗ 𝑁!) となります。 • 空きマスが少ないデータセット 1 なら高速で解けますが、空きマスが 多めのデータセット 2 だとかなりの時間がかかってしまいます。
  • 20. 考察 • 1 から順に置いていくことにします。 • この場合、どのような条件が満たされたら良くて、どのような条件が 満たされたらダメなのかを考えてみます。
  • 21. 考察 • 今新たに数を置くときに、上下または左右で隣接するマスについて 考えてみます (ここでは例として左右を考えます、上下も同様に処理 できます)。以下の 4 つの場合が考えられます。 • (A) : 左右のうち一方が盤面の外 (端のケース) • (B) : 左右のうち両方が空きマス。 • (C) : 左右のうち一方が埋まっている。 • (D) : 左右のうち両方が埋まっている。 (B) 数 (C) 数 (D) 数(A)
  • 22. 考察 • (A)のケースは、条件に違反することはありません。 • (B)のケースは、今置く数を置いた時点では矛盾しません。真ん中が 最小値です。 • (C)のケースは、後で空いているマスにより大きい数を置くことになる ので、この時点で矛盾していることが分かります。 • (D)のケースは今置く数を置いた時点では矛盾しません。真ん中が 最大値です。 (B) 数 (C) 数 (D) 数(A)
  • 23. 考察 • 先ほどの (C) を検出して除外するアルゴリズムだけで、すべての正し い置き方を列挙することができるのでしょうか?
  • 24. 考察 • 先ほどの (C) を検出して除外するアルゴリズムだけで、すべての正し い置き方を列挙することができるのでしょうか? • →これできちんとチェックできます。なぜなら、連続する 3 マスについ て、それらの大小関係はちょうど 2 個目が置かれたときに定まり、か つダメなケースでは必ず (C) を経由することになるからです。 • 一方で(C)さえ経由しなければ最後まで置けた配置はいずれも条件 を満たします。
  • 25. 満点解法 (30+70点) • もちろん先ほどのチェックを導入してもただすべての置き方をそのま ま試すだけでは、結局 O(𝑁!) 通り見ることになります。 • 重要なこととして、先ほどのチェックに用いたのは、今現在置く数と の大小関係のみなので、既に置いた数同士の大小関係は覚えなく ても良いです。 • そのため、既に置いた場所の集合が同じ状態同士を一緒くたにして 計算することができます。
  • 26. 満点解法 (30+70点) • ここで、bitDP と呼ばれるアルゴリズムを使用することができます。 • dp[i] = 今現在置かれている数字の配置が整数 i で表されるとき、現 時点で矛盾なく置かれている配置の総数。 • i は 25 ビットの非負整数で、盤面をビットで表します (例えば 10 マス 目が埋まっているなら第 10 ビットが 1 でそうでないなら第 10 ビット が 0)。 • このとき、dp[i]= dp[i−2j−1] ∗ 𝑓(i−2j−1, j)25 j=1 となります。ただし、ここ で 𝑓(i, j) は、i の第 j ビットが 0 であり、状態 i から新たに数を j マス 目においても矛盾しない場合に 1 を、それ以外の場合に 0 を返す関 数とします。また、dp[0]=1 とします。
  • 27. 満点解法 (30+70点) • 先ほどの bitDP は O(2 𝑁) の計算量で動作します。 • 𝑁 ≦ 20 なので、データセット 2 でも速く動作します。