SlideShare a Scribd company logo
1 of 24
Download to read offline
競技プログラミング講義
#2 「全探索」
全探索とは
●
考えられる全ての結果を考慮して問題を解
く方法
●
やるだけの一種(?)
●
基本的には「再起関数」によって「状態の
遷移」を考えることで実現する
 再帰関数
再帰関数
●
自分の中で自分を呼び出す関数
●
終了条件をつけてどこかの時点で動作を停
止させるようにする必要がある
例:フィボナッチ数列
int fib(int n){
if(n==0||n==1)return 1;
else return fib(n-2)+fib(n-1);
}
例:フィボナッチ数列
●
fib(3) :
 ー fib(1) : return 1
 ー fib(2) :
   ー fib(0) : return 1
   ー fib(1) : return 1
   return 1+1=2
  return 1+2=3
                状態
状態
●
問題文の状態が実際に起こったと仮定する
●
その時の世界の状態のこと
– 担任団の数学科の先生がどこにいたか
– 地球の反対側にいるひとが何をしていたか
– パソコンのメモリの状態
状態を扱う
●
「世界の状態」の種類は数えきれないほど
たくさんある
●
今考えている問題に「数学科の教師がどこ
にいたか」はおそらく関係がない
→ 同様に「関係のある要素」だけにしぼっ
て状態を考えると扱いきれる
状態の遷移
● 「 A 君が 500 円を持っている」という状態
を考える
● 今確率 50% で 1000 円がもらえるようなキ
ャンペーンをやっているとすると、今から
– 確率 50% で「 A 君が 1500 円持ってい
る」という状態
– 確率 50% で「 A 君が 500 円持っている」
という状態
に遷移する可能性があることになる
全探索における状態
● このような「状態の遷移」を全て考慮し、
最終的な結果を比較することで答えを得る
● 状態の遷移の可能性の数が計算量に影響し
てくる
状態の表現
●
再起関数の引数
●
配列
によって表現することが多い
    全探索
全探索の例
●
ナップサック問題
重さ W[i] と価値 V[i] が決まっている N 個
の品物がある。重さの総和が S を超えない
ように品物を選んだときの、それらの品物
の価値の総和の最大値を求めよ。
1 N 20≦ ≦
1 W[i],V[i] 1,000,000≦ ≦
1 S 1,000,000≦ ≦
解法
● 再帰関数…引数を状態として持つような再
帰関数
● 状態…
解法
● 再帰関数…引数を状態として持ち、その状
態から到達できる状態の中で最大の価値を
返すような再帰関数
● 状態…「 i 個目の品物の前まで選んで重さ
の総和が T 、価値の総和が U になってい
て、 i 個目の品物を取るかどうか悩んでい
る」という状態
解法ー状態の遷移
● i 個目の品物をとったとき
(i+1) 個目の品物の前まで選び終わり、重さ
の総和が T+W[i] 、価値の総和が U+V[i] で
あるという状態
● i 個目の品物をとらなかったとき
(i+1) 個目の品物の前まで選び終わり、重さ
の総和が T 、価値の総和が U であるという
状態
解法ー実装
● これを再帰関数で実装する
● 品物を取るとき、重さの総和が S を超える
ような選び方はしない(条件に反する)
● i=n+1 のとき、全て選び終わったというこ
となので終了(そのときの価値を返す)
● それぞれの状態では、良かった方(価値の
高かった方)を返せば良い
模範解答
int N,S,W[20],V[20];
int nap(int T,int U,int i){
  if(i==N)return U;
  int res=0;
  if(T+W[i]<=S)res=nap(T+W[i],U+V[i],i+1);
  res=max(res,nap(T,U,i+1));
  return res;
}
// nap(0,0,0) が答え
全探索まとめ
● 先ほどのコードの計算量は、それぞれの状
態に対して原則選択肢が 2 つあり、終了す
るまでに状態を N ほど経由するので
計算量はだいたい 2^N 、最悪で
2^20 1,000,000≒
● 指数 (2^1=2,2^10=1024,2^100 10^30)≒ 的
に計算量が増加するので、サイズの大きい
問題には対処できない
〜実装タイム〜
NPCA Judge  問題「講義用問題 2 」
ポイント
● 「 i 個目の前までに、確定した得点が S 、
現在続いている駒の得点の総和が R で、 j
個黒を表にして置いた」という状態につい
て考える
● i 個目を表に置くかどうかで状態の遷移を
考える
練習問題
● AOJ 0525 「 Osembei 」
こ… これ…これは…………状態遷移だあああ
ああ┗ (^o^)┛ WwwwWWWW
┏(^o^)┓ ドコドコドコドコwwwWWwwww
      →次回 #3 「幅・深さ優先探索」
         or 「ソートアルゴリズム」
               or 「貪欲法」
To be continued...

More Related Content

What's hot

TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++sleepy_yoshi
 
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装するShuhei Iitsuka
 
for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力imuyaoti
 
第4回MachineLearningのための数学塾資料(浅川)
第4回MachineLearningのための数学塾資料(浅川)第4回MachineLearningのための数学塾資料(浅川)
第4回MachineLearningのための数学塾資料(浅川)Shin Asakawa
 
DS Exercise Course 3
DS Exercise Course 3DS Exercise Course 3
DS Exercise Course 3大貴 末廣
 
パターン認識 05 ロジスティック回帰
パターン認識 05 ロジスティック回帰パターン認識 05 ロジスティック回帰
パターン認識 05 ロジスティック回帰sleipnir002
 
機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)Kota Matsui
 
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜Takeshi Arabiki
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~んTokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~んsleepy_yoshi
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
Crfと素性テンプレート
Crfと素性テンプレートCrfと素性テンプレート
Crfと素性テンプレートKei Uchiumi
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
最適化の手前の数学
最適化の手前の数学最適化の手前の数学
最適化の手前の数学俊介 後藤
 

What's hot (20)

TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
 
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装する
 
for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力
 
第4回MachineLearningのための数学塾資料(浅川)
第4回MachineLearningのための数学塾資料(浅川)第4回MachineLearningのための数学塾資料(浅川)
第4回MachineLearningのための数学塾資料(浅川)
 
DS Exercise Course 3
DS Exercise Course 3DS Exercise Course 3
DS Exercise Course 3
 
NumPy闇入門
NumPy闇入門NumPy闇入門
NumPy闇入門
 
パターン認識 05 ロジスティック回帰
パターン認識 05 ロジスティック回帰パターン認識 05 ロジスティック回帰
パターン認識 05 ロジスティック回帰
 
機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)
 
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~んTokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
 
R高速化
R高速化R高速化
R高速化
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
Crfと素性テンプレート
Crfと素性テンプレートCrfと素性テンプレート
Crfと素性テンプレート
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
関数
関数関数
関数
 
Python opt
Python optPython opt
Python opt
 
最適化の手前の数学
最適化の手前の数学最適化の手前の数学
最適化の手前の数学
 

Viewers also liked

実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法nitoyon
 
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶしAtCoder Inc.
 

Viewers also liked (6)

実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法
 
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
 
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
 
TCO2017R1
TCO2017R1TCO2017R1
TCO2017R1
 
深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし
 

More from Ryunosuke Iwai (12)

音声認識
音声認識音声認識
音声認識
 
DP
DPDP
DP
 
貪欲
貪欲貪欲
貪欲
 
全探索2
全探索2全探索2
全探索2
 
導入
導入導入
導入
 
Rth number
Rth numberRth number
Rth number
 
Glasses
GlassesGlasses
Glasses
 
Ice
IceIce
Ice
 
Water flow
Water flowWater flow
Water flow
 
文字列処理
文字列処理文字列処理
文字列処理
 
データ処理
データ処理データ処理
データ処理
 
Arduino
ArduinoArduino
Arduino
 

全探索