動的計画法の基礎

overview

  • DPはいつでも解法の1つになりえる
  • 特にサブ問題に関連する問題に適用できる
  • 分割統治との違いは、同じサブ問題が何度も起こり得ること。そのため、cacheが有効
  • 枝刈りを行う場合などは、再帰のほうが適している可能性がある

bootcamp

  • fibonacci関数
  • time O(n), space O(1)
def fibonacchi(n):
  if n <= 1:
    return n
    
  f_minus_2, f_minus_1 = 0, 1
  for _ in range(1,n):
    f = f_minus_2 + f_minus_1
    f_minus_2, f_minus_1 = f_minus_1, f
  
  return f_minus_1
  • 数字の配列があり、もっとも和が大きくなるサブ配列を求める
  • 単にそれまでの最大をもっていてもダメ
  • それまでの最小と最大をもち、更新していく
def find_maximum_subarray(A):
  min_sum = max_sum = 0
  
  for current_sum in itertools.accumulate(A):
    min_sum = min(min_sum, running_sum)
    max_sum = max(max_sum, running_sum - min_sum)
    
 return max_sum

16.1 Count The Number Of Score Combinations

  • アメリカンフットボールゲームで、2points, 3points, 7pointsの得点がある
  • ある合計得点について、その点になるすべての組み合わせ数を求める
  • time O(n^2) space(ns) s:number of point pattern
def num_combinations_for_final_score(final_score, individual_play_scores):
  num_combinations_for_score = [[1]+[0]*final_score for _ in individual_play_scores]
  for i in range(1, final_score+1):
    without_this_play = (num_combinations_for_score[i-1][j] if i>=1 else 0)
    with_this_play = (num_combinations_for_score[i][j - individual_play_scores[i]] if j>=individual_play_scores[i] else 0)
    num_combinations_for_score[i][j] = (without_this_play + with_this_play)
    
  return num_combination_for_score[-1][-1]
このエントリーをはてなブックマークに追加
Takatomo Honda avatar
About Takatomo Honda
システム開発 / プロトタイプ開発 / 開発組織の構築 / アプリケーションの内製化 /等、お気軽にご相談ください。