Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

全探索

3,129 views

Published on

NPCA 講義2013 競技プログラミング #2

  • Dating for everyone is here: ♥♥♥ http://bit.ly/2Qu6Caa ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ♥♥♥ http://bit.ly/2Qu6Caa ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

全探索

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

×