匷åãªåçèšç»æ³ãã¯ããã¯ã§ããã¡ã¢åããå®è·µçãªäŸãšã°ããŒãã«ãªèŠç¹ã§æ¢æ±ããŸããã¢ã«ãŽãªãºã ã¹ãã«ãåäžãããè€éãªåé¡ãå¹ççã«è§£æ±ºããŸãããã
åçèšç»æ³ã®ç¿åŸïŒå¹ççãªåé¡è§£æ±ºã®ããã®ã¡ã¢åãã¿ãŒã³
åçèšç»æ³ïŒDPïŒã¯ãæé©ååé¡ãããå°ããªãéè€ããéšååé¡ã«åå²ããŠè§£æ±ºããããã®åŒ·åãªã¢ã«ãŽãªãºã æè¡ã§ãããããã®éšååé¡ãç¹°ãè¿ãè§£ã代ããã«ãDPã¯ãã®è§£ãä¿åããå¿ èŠãªãšãã«åå©çšããããšã§å¹çãå€§å¹ ã«åäžãããŸããã¡ã¢åã¯DPãžã®ç¹å®ã®ãããããŠã³ã¢ãããŒãã§ããããã£ãã·ã¥ïŒå€ãã¯èŸæžãé åïŒã䜿çšããŠã³ã¹ãã®é«ã颿°åŒã³åºãã®çµæãä¿åããåãå ¥åãå床çºçãããšãã«ãã£ãã·ã¥ãããçµæãè¿ããŸãã
ã¡ã¢åãšã¯ïŒ
ã¡ã¢åãšã¯ãæ¬è³ªçã«ãèšç®ã³ã¹ãã®é«ã颿°åŒã³åºãã®çµæããèšæ¶ãããåŸã§åå©çšããããšã§ããããã¯ãåé·ãªèšç®ãé¿ããããšã§å®è¡ãé«éåãããã£ãã·ã³ã°ã®äžåœ¢æ ã§ããå¿ èŠãªæ å ±ãæ¯åå°ãåºãã®ã§ã¯ãªããåèæžã§èª¿ã¹ããããªãã®ã ãšèããŠãã ããã
ã¡ã¢åã®äž»èŠãªèŠçŽ ã¯æ¬¡ã®ãšããã§ãïŒ
- ååž°é¢æ°ïŒ ã¡ã¢åã¯éåžžãéè€ããéšååé¡ãæã€ååž°é¢æ°ã«é©çšãããŸãã
- ãã£ãã·ã¥ïŒã¡ã¢ïŒïŒ ããã¯é¢æ°åŒã³åºãã®çµæãä¿åããããã®ããŒã¿æ§é ïŒäŸïŒèŸæžãé åãããã·ã¥ããŒãã«ïŒã§ãã颿°ã®å ¥åãã©ã¡ãŒã¿ãããŒãšããŠæ©èœããè¿ãããå€ããã®ããŒã«é¢é£ä»ããããå€ãšãªããŸãã
- èšç®åã®ã«ãã¯ã¢ããïŒ é¢æ°ã®ã³ã¢ããžãã¯ãå®è¡ããåã«ãäžããããå ¥åãã©ã¡ãŒã¿ã®çµæããã£ãã·ã¥ã«æ¢ã«ååšãããã©ããã確èªããŸããååšããå Žåã¯ããã£ãã·ã¥ãããå€ãããã«è¿ããŸãã
- çµæã®ä¿åïŒ çµæããã£ãã·ã¥ã«ãªãå Žåã¯ã颿°ã®ããžãã¯ãå®è¡ããèšç®ãããçµæãå ¥åãã©ã¡ãŒã¿ãããŒãšããŠãã£ãã·ã¥ã«ä¿åããŠããããã®çµæãè¿ããŸãã
ãªãã¡ã¢åã䜿çšããã®ãïŒ
ã¡ã¢åã®äž»ãªå©ç¹ã¯ãããã©ãŒãã³ã¹ã®åäžã§ããç¹ã«ãåçŽãªæ¹æ³ã§è§£ããšææ°æéèšç®éã«ãªãåé¡ã«å¯ŸããŠå¹æçã§ããåé·ãªèšç®ãé¿ããããšã§ãã¡ã¢åã¯å®è¡æéãææ°æéããå€é åŒæéã«ççž®ããæã«è² ããªãåé¡ãæ±ããããåé¡ã«å€ããããšãã§ããŸããããã¯ã次ã®ãããªå€ãã®å®äžçã®ã¢ããªã±ãŒã·ã§ã³ã§éåžžã«éèŠã§ãïŒ
- ãã€ãªã€ã³ãã©ããã£ã¯ã¹ïŒ é åã¢ã©ã€ã³ã¡ã³ããã¿ã³ãã¯è³ªãã©ãŒã«ãã£ã³ã°äºæž¬ã
- éèã¢ããªã³ã°ïŒ ãªãã·ã§ã³äŸ¡æ Œèšå®ãããŒããã©ãªãªæé©åã
- ã²ãŒã éçºïŒ çµè·¯æ¢çŽ¢ïŒäŸïŒA*ã¢ã«ãŽãªãºã ïŒãã²ãŒã AIã
- ã³ã³ãã€ã©èšèšïŒ æ§æè§£æãã³ãŒãæé©åã
- èªç¶èšèªåŠçïŒ é³å£°èªèãæ©æ¢°ç¿»èš³ã
ã¡ã¢åã®ãã¿ãŒã³ãšäŸ
å®è·µçãªäŸã亀ããªãããäžè¬çãªã¡ã¢åã®ãã¿ãŒã³ãããã€ãèŠãŠãããŸãããã
1. å€å žçãªãã£ããããæ°å
ãã£ããããæ°åã¯ãã¡ã¢åã®åã瀺ãå€å žçãªäŸã§ãããã®æ°åã¯æ¬¡ã®ããã«å®çŸ©ãããŸãïŒF(0) = 0, F(1) = 1, ãã㊠n > 1 ã®å Žå F(n) = F(n-1) + F(n-2)ãåçŽãªååž°çå®è£ ã¯ãåé·ãªèšç®ã®ããã«ææ°æéèšç®éã«ãªããŸãã
åçŽãªååž°çå®è£ ïŒã¡ã¢åãªãïŒ
def fibonacci_naive(n):
if n <= 1:
return n
return fibonacci_naive(n-1) + fibonacci_naive(n-2)
ãã®å®è£ ã¯ãåããã£ããããæ°ãäœåºŠãåèšç®ãããããéåžžã«éå¹çã§ããäŸãã°ã`fibonacci_naive(5)` ãèšç®ããããã«ã¯ã`fibonacci_naive(3)` ã2åã`fibonacci_naive(2)` ã3åèšç®ãããŸãã
ã¡ã¢åããããã£ããããã®å®è£
def fibonacci_memo(n, memo={}):
if n in memo:
return memo[n]
if n <= 1:
return n
memo[n] = fibonacci_memo(n-1, memo) + fibonacci_memo(n-2, memo)
return memo[n]
ãã®ã¡ã¢åãããããŒãžã§ã³ã¯ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããŸãã`memo` èŸæžã¯ã以åã«èšç®ããããã£ããããæ°ã®çµæãä¿åããŸããF(n)ãèšç®ããåã«ã颿°ã¯ããããã§ã« `memo` ã«ãããã©ããããã§ãã¯ããŸããããããã°ããã£ãã·ã¥ãããå€ãçŽæ¥è¿ãããŸããããã§ãªããã°ãå€ãèšç®ããã`memo` ã«ä¿åãããåŸãè¿ãããŸãã
äŸ (Python):
print(fibonacci_memo(10)) # Output: 55
print(fibonacci_memo(20)) # Output: 6765
print(fibonacci_memo(30)) # Output: 832040
ã¡ã¢åããããã£ãããã颿°ã®æéèšç®éã¯O(n)ã§ãããåçŽãªååž°çå®è£ ã®ææ°æéèšç®éããã®å€§å¹ ãªæ¹åã§ãã空éèšç®éã `memo` èŸæžã®ããã«O(n)ã«ãªããŸãã
2. ã°ãªããæ¢çŽ¢ïŒçµè·¯ã®æ°ïŒ
m x n ãµã€ãºã®ã°ãªãããèããŠã¿ãŸããããå³ãŸãã¯äžã«ããç§»åã§ããŸãããå·Šäžé ããå³äžé ãŸã§ã®ç°ãªãçµè·¯ã¯ããã€ãããŸããïŒ
åçŽãªååž°çå®è£
def grid_paths_naive(m, n):
if m == 1 or n == 1:
return 1
return grid_paths_naive(m-1, n) + grid_paths_naive(m, n-1)
ãã®åçŽãªå®è£ ã¯ãéè€ããéšååé¡ã®ããã«ææ°æéèšç®éã«ãªããŸããã»ã«(m, n)ãžã®çµè·¯æ°ãèšç®ããã«ã¯ã(m-1, n)ãš(m, n-1)ãžã®çµè·¯æ°ãèšç®ããå¿ èŠãããããããã¯ããã«ãã®åã®ã»ã«ãžã®çµè·¯ãèšç®ããå¿ èŠããããŸãã
ã¡ã¢åãããã°ãªããæ¢çŽ¢ã®å®è£
def grid_paths_memo(m, n, memo={}):
if (m, n) in memo:
return memo[(m, n)]
if m == 1 or n == 1:
return 1
memo[(m, n)] = grid_paths_memo(m-1, n, memo) + grid_paths_memo(m, n-1, memo)
return memo[(m, n)]
ãã®ã¡ã¢åãããããŒãžã§ã³ã§ã¯ã`memo` èŸæžãåã»ã«(m, n)ã®çµè·¯æ°ãä¿åããŸãã颿°ã¯ãŸããçŸåšã®ã»ã«ã®çµæããã§ã« `memo` ã«ãããã©ããããã§ãã¯ããŸããããããã°ããã£ãã·ã¥ãããå€ãè¿ãããŸããããã§ãªããã°ãå€ãèšç®ããã`memo` ã«ä¿åãããŠããè¿ãããŸãã
äŸ (Python):
print(grid_paths_memo(3, 3)) # Output: 6
print(grid_paths_memo(5, 5)) # Output: 70
print(grid_paths_memo(10, 10)) # Output: 48620
ã¡ã¢åãããã°ãªããæ¢çŽ¢é¢æ°ã®æéèšç®éã¯O(m*n)ã§ãããåçŽãªååž°çå®è£ ã®ææ°æéèšç®éããã®å€§å¹ ãªæ¹åã§ãã空éèšç®éã `memo` èŸæžã®ããã«O(m*n)ã«ãªããŸãã
3. ã³ã€ã³ãã§ã³ãžåé¡ïŒæå°ç¡¬è²šææ°ïŒ
äžé£ã®ç¡¬è²šã®é¡é¢ãšç®æšéé¡ãäžããããå Žåããã®éé¡ãäœãããã«å¿ èŠãªæå°ã®ç¡¬è²šææ°ãèŠã€ããŠãã ãããåé¡é¢ã®ç¡¬è²šã¯ç¡å¶éã«ãããšä»®å®ã§ããŸãã
åçŽãªååž°çå®è£
def coin_change_naive(coins, amount):
if amount == 0:
return 0
if amount < 0:
return float('inf')
min_coins = float('inf')
for coin in coins:
num_coins = 1 + coin_change_naive(coins, amount - coin)
min_coins = min(min_coins, num_coins)
return min_coins
ãã®åçŽãªååž°çå®è£ ã¯ãèãããããã¹ãŠã®ç¡¬è²šã®çµã¿åãããæ¢çŽ¢ãããããææ°æéèšç®éã«ãªããŸãã
ã¡ã¢åãããã³ã€ã³ãã§ã³ãžã®å®è£
def coin_change_memo(coins, amount, memo={}):
if amount in memo:
return memo[amount]
if amount == 0:
return 0
if amount < 0:
return float('inf')
min_coins = float('inf')
for coin in coins:
num_coins = 1 + coin_change_memo(coins, amount - coin, memo)
min_coins = min(min_coins, num_coins)
memo[amount] = min_coins
return min_coins
ã¡ã¢åãããããŒãžã§ã³ã¯ãåéé¡ã«å¿ èŠãªæå°ç¡¬è²šææ°ã `memo` èŸæžã«ä¿åããŸããç¹å®ã®éé¡ã«å¯Ÿããæå°ç¡¬è²šææ°ãèšç®ããåã«ã颿°ã¯çµæããã§ã« `memo` ã«ããããã§ãã¯ããŸããããããã°ããã£ãã·ã¥ãããå€ãè¿ãããŸããããã§ãªããã°ãå€ãèšç®ããã`memo` ã«ä¿åãããŠããè¿ãããŸãã
äŸ (Python):
coins = [1, 2, 5]
amount = 11
print(coin_change_memo(coins, amount)) # Output: 3
coins = [2]
amount = 3
print(coin_change_memo(coins, amount)) # Output: inf (cannot make change)
ã¡ã¢åãããã³ã€ã³ãã§ã³ãžé¢æ°ã®æéèšç®éã¯O(amount * n)ã§ããããã§nã¯ç¡¬è²šã®é¡é¢ã®æ°ã§ãã空éèšç®é㯠`memo` èŸæžã®ããã«O(amount)ã§ãã
ã¡ã¢åã«é¢ããã°ããŒãã«ãªèŠç¹
åçèšç»æ³ãšã¡ã¢åã®å¿çšã¯æ®éçã§ãããåãçµãå ·äœçãªåé¡ãããŒã¿ã»ããã¯ãçµæžçã瀟äŒçãæè¡çãªæèã®éãã«ããå°åã«ãã£ãŠç°ãªãããšããããããŸããäŸãã°ïŒ
- ç©æµã«ãããæé©åïŒ äžåœãã€ã³ãã®ãããªå€§èŠæš¡ã§è€éãªèŒžéãããã¯ãŒã¯ãæã€åœã§ã¯ãé éã«ãŒãããµãã©ã€ãã§ãŒã³ç®¡çãæé©åããããã«DPãšã¡ã¢åãäžå¯æ¬ ã§ãã
- æ°èåžå Žã«ãããéèã¢ããªã³ã°ïŒ æ°èçµæžåœã®ç ç©¶è ã¯ãDPæè¡ã䜿çšããŠéèåžå Žãã¢ãã«åããããŒã¿ãäžè¶³ããŠãããä¿¡é Œæ§ãäœãã£ããããçŸå°ã®ç¶æ³ã«åãããæè³æŠç¥ãéçºããŸãã
- å ¬è¡è¡çã«ããããã€ãªã€ã³ãã©ããã£ã¯ã¹ïŒ ç¹å®ã®å¥åº·èª²é¡ã«çŽé¢ããŠããå°åïŒäŸïŒæ±åã¢ãžã¢ãã¢ããªã«ã®ç±åž¯ç ïŒã§ã¯ãã²ãã ããŒã¿ãåæããæšçæ²»çæ³ãéçºããããã«DPã¢ã«ãŽãªãºã ã䜿çšãããŸãã
- åçå¯èœãšãã«ã®ãŒã®æé©åïŒ æç¶å¯èœãªãšãã«ã®ãŒã«çŠç¹ãåœãŠãŠããåœã ã§ã¯ãDPã¯ãšãã«ã®ãŒã°ãªããã®æé©åã«åœ¹ç«ã¡ãŸããç¹ã«ãåçå¯èœãšãã«ã®ãŒæºãçµã¿åããããšãã«ã®ãŒçç£ãäºæž¬ããå¹ççã«ãšãã«ã®ãŒãåé ããéã«éèŠã§ãã
ã¡ã¢åã®ãã¹ããã©ã¯ãã£ã¹
- éè€ããéšååé¡ãç¹å®ããïŒ ã¡ã¢åã¯ãåé¡ãéè€ããéšååé¡ã瀺ãå Žåã«ã®ã¿å¹æçã§ããéšååé¡ãç¬ç«ããŠããå Žåãã¡ã¢åã¯å€§å¹ ãªããã©ãŒãã³ã¹åäžããããããŸããã
- ãã£ãã·ã¥ã«é©ããããŒã¿æ§é ãéžæããïŒ ãã£ãã·ã¥ã®ããŒã¿æ§é ã®éžæã¯ãåé¡ã®æ§è³ªãšãã£ãã·ã¥ãããå€ã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããããŒã®ã¿ã€ãã«äŸåããŸããèŸæžã¯æ±çšçãªã¡ã¢åã«é©ããŠããããšãå€ãã§ãããããŒã劥åœãªç¯å²å ã®æŽæ°ã§ããå Žåã¯é åã®æ¹ãå¹ççã§ãã
- ãšããžã±ãŒã¹ãæ éã«åŠçããïŒ ç¡éååž°ãäžæ£ãªçµæãé¿ããããã«ãååž°é¢æ°ã®ããŒã¹ã±ãŒã¹ãæ£ããåŠçãããŠããããšã確èªããŠãã ããã
- 空éèšç®éãèæ ®ããïŒ ã¡ã¢åã¯é¢æ°åŒã³åºãã®çµæããã£ãã·ã¥ã«ä¿åããå¿ èŠãããããã空éèšç®éãå¢å ããå¯èœæ§ããããŸããå Žåã«ãã£ãŠã¯ãéå°ãªã¡ã¢ãªæ¶è²»ãé¿ããããã«ãã£ãã·ã¥ã®ãµã€ãºãå¶éããããå¥ã®ã¢ãããŒãã䜿çšãããããå¿ èŠããããŸãã
- æç¢ºãªåœåèŠåã䜿çšããïŒ ã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžãããããã«ã颿°ãšã¡ã¢ã«èª¬æçãªååãéžæããŠãã ããã
- 培åºçã«ãã¹ãããïŒ ã¡ã¢åããã颿°ãããšããžã±ãŒã¹ã倧ããªå ¥åãå«ãããŸããŸãªå ¥åã§ãã¹ãããæ£ããçµæãçæããããã©ãŒãã³ã¹èŠä»¶ãæºããããšã確èªããŠãã ããã
é«åºŠãªã¡ã¢åãã¯ããã¯
- LRU (Least Recently Used) ãã£ãã·ã¥ïŒ ã¡ã¢ãªäœ¿çšéãæžå¿µãããå Žåã¯ãLRUãã£ãã·ã¥ã®äœ¿çšãæ€èšããŠãã ããããã®ã¿ã€ãã®ãã£ãã·ã¥ã¯ã容éã«éãããšæãæè¿äœ¿çšãããŠããªãã¢ã€ãã ãèªåçã«åé€ããéå°ãªã¡ã¢ãªæ¶è²»ãé²ããŸããPythonã®`functools.lru_cache`ãã³ã¬ãŒã¿ã¯ãLRUãã£ãã·ã¥ãå®è£ ãã䟿å©ãªæ¹æ³ãæäŸããŸãã
- å€éšã¹ãã¬ãŒãžã䜿çšããã¡ã¢åïŒ éåžžã«å€§ããªããŒã¿ã»ãããèšç®ã®å Žåãã¡ã¢åãããçµæããã£ã¹ã¯ãããŒã¿ããŒã¹ã«ä¿åããå¿ èŠããããããããŸãããããã«ãããå©çšå¯èœãªã¡ã¢ãªãè¶ ããå¯èœæ§ã®ããåé¡ãåŠçã§ããŸãã
- ã¡ã¢åãšå埩ã®çµã¿åããïŒ ã¡ã¢åãå埩çãªïŒããã ã¢ããïŒã¢ãããŒããšçµã¿åãããããšã§ãç¹ã«éšååé¡éã®äŸåé¢ä¿ãæç¢ºã«å®çŸ©ãããŠããå Žåã«ãããå¹ççãªè§£æ±ºçã«ã€ãªããããšããããŸããããã¯ãåçèšç»æ³ã§ã¯ãã°ãã°ããŒãã«åïŒtabulationïŒæ³ãšåŒã°ããŸãã
çµè«
ã¡ã¢åã¯ãã³ã¹ãã®é«ã颿°åŒã³åºãã®çµæããã£ãã·ã¥ããããšã§ååž°ã¢ã«ãŽãªãºã ãæé©åããããã®åŒ·åãªãã¯ããã¯ã§ããã¡ã¢åã®ååãçè§£ããæŠç¥çã«é©çšããããšã§ãã³ãŒãã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããè€éãªåé¡ãããå¹ççã«è§£æ±ºã§ããŸãããã£ããããæ°ããã°ãªããæ¢çŽ¢ãã³ã€ã³ãã§ã³ãžåé¡ãŸã§ãã¡ã¢åã¯å¹ åºãèšç®äžã®èª²é¡ã«åãçµãããã®å€çšéãªããŒã«ã»ãããæäŸããŸããã¢ã«ãŽãªãºã ã¹ãã«ã磚ãç¶ããäžã§ãã¡ã¢åãç¿åŸããããšã¯ãåé¡è§£æ±ºã®æŠåšãšããŠééããªã貎éãªè³ç£ãšãªãã§ãããã
åé¡ã®ã°ããŒãã«ãªæèãèæ ®ããããŸããŸãªå°åãæåã®ç¹å®ã®ããŒãºãå¶çŽã«ãœãªã¥ãŒã·ã§ã³ãé©å¿ãããããšãå¿ããªãã§ãã ãããã°ããŒãã«ãªèŠç¹ãåãå ¥ããããšã§ãããåºç¯ãªãªãŒãã£ãšã³ã¹ã«å©çãããããããã广çã§ã€ã³ãã¯ãã®ãããœãªã¥ãŒã·ã§ã³ãäœæã§ããŸãã