FORCIAã¢ããã³ãã«ã¬ã³ããŒ2018 ã®9æ¥ç®ã®èšäºã§ãã æè¡æ¬éšã®é«æ©ã§ãããããŸã§äœåºŠãè§£ããŠã¿ãããšæã£ãŠã¯è·³ãè¿ããç¶ãããã®DPãããããããããµãã¯åé¡ã«ãç·ã³ãŒããŒã®ç§ãæ¹ããŠææŠããŠã¿ãŸããã ç·ã³ãŒããŒãšã¯ã Atcoder ã§ã¬ãŒãã£ã³ã°ã800ïœ1199ã®äººã§ããã¡ãã£ãšç«¶ãããã£ãŠãŸããšããã¬ãã«ã§ãAtCoderã®Cåé¡ã¯è§£ãããã©ãDåé¡ãè§£ããªããããã®äººã ãããšèªåã§ã¯èããŠããŸãã ãã§ã«ãåçèšç»æ³ / ããããµãã¯åé¡ã®è§£èª¬ã¯å€ããããŸããããã®èšäºãå°ãã§ãç§ãšåããããªäººã®åœ¹ã«ç«ãŠã°å¹žãã§ãã DPïŒããããµãã¯åé¡ïŒ DPãšã¯ çªç¶ã§ããããDPããšèšãããŠäœã®ããšã ãåãããŸããïŒ ããŒã¿ããã»ããµãŒãããã«ãã¬ãŒ...è²ã
ãªãã®ã®ç¥ç§°ãšããŠäœ¿ãããããã§ããããã©ã«ã·ã¢ã§ã¯ãäž»ã«æ¬¡ã®3ã€ã®æå³ã§äœ¿ãããããšãå€ãã§ãã Dynamic PackageïŒãã€ãããã¯ããã±ãŒãžïŒ æ
è¡ååã®äžã€ãé£è¡æ©ãæ°å¹¹ç·ãªã©ã®äº€éææ®µãšããã«ãªã©ã®å®¿æ³æœèšãå©çšè
ãèªç±ã«çµã¿åãããŠæ
è¡ãã©ã³ãäœæã§ããã Dynamic PricingïŒãã€ãããã¯ãã©ã€ã·ã³ã°ïŒ éèŠãšäŸçµŠã®ç¶æ³ã«å¿ããŠäŸ¡æ Œãå€åãããä»çµã¿ã売äžã®åäžãšæœåšéèŠã®åµåºãå®çŸãé絊ãã³ã³ãããŒã«ããã Dynamic ProgrammingïŒåçèšç»æ³ïŒ ãåçèšç»æ³ããšåŒã°ããã¢ã«ãŽãªãºã ã®äžã€ãåé¡ãè€æ°ã®éšååé¡ã«åå²ããéšååé¡ã®èšç®çµæãå©çšããŠå
šäœã®æé©åãã¯ããã ä»åã玹ä»ããã®ã¯ã3ã€ç®ã«ã玹ä»ãã Dynamic ProgrammingïŒåçèšç»æ³ïŒ ã (01)ããããµãã¯åé¡ãšã¯ DPã䜿ã£ãŠè§£ãå
žåçãªåé¡ã®äžã€ã§ããåå¿è
ããŸãè©°ãŸãåé¡ã§ãäŸããå€ããããããŸãããã髿 ¡æ°åŠã®ãã¯ãã«ã®ãããªååšã ãšèªåã¯èããŠããŸããäŸã«æŒãããç§ãèªåã§å®è£
ããããšãããšæãæ¢ãŸã£ãŠããŸããäœåºŠè§£èª¬ãèŠãŠããã£ããããŸããã§ããã ããããµãã¯å顿ŠèŠ DPãçè§£ããããã« å
žåçãª01ããããµãã¯åé¡ã®èšå®ã ãšããªãã ãããããããªãã®ã§ãä»åã¯ãäºç®1000åã§ãµã€ãŒãªã€ã«è¡ã£ãŠãåããã®ãé ŒãŸãã«æåã§ããæå€§ã®ã«ããªãŒãæ±ãããšããåé¡ã«ããŠã¿ãŸãããã¡ãã¥ãŒã¯èªåããµã€ãŒãªã€ã«è¡ã£ããããé£ã¹ããã®ããã§ã€ã¹ããŸããã ã¡ãã¥ãŒ [åå], [ã«ããªãŒ], [倿®µ], [å¡©å] ããããããã³ã®ãµã©ã,134,299,1.2 åçåµãšããŒã¯ã®ãµã©ã,433,599,2.3 ã»ãããèã®ãœããŒ,80,189,1.0 ãã¬ãã·ã¥ããŒãºãšãããã®ãµã©ã,169,299,1.1 ããã·ã¥ãŒã(ãã«ãç£çæçãã ),225,399,2.7 èŸå³ããã³,333,299,2.3 ãã§ãªãœãŒ(èŸå³ãœãŒã»ãŒãž),380,399,2.5 ãã«ã²ãªãŒã¿ãã¶,568,399,2.5 ãã³ãã§ãã¿ã®ãã¶,646,399,2.4 ã¢ã©ãã¢ãŒã¿,591,399,3.7 ããŒããœãŒã¹ãããã¢é¢š,538,399,3.6 ãã©ã颚ããªã¢,519,299,2.7 åçåµã®ãã©ã颚ããªã¢,609,368,2.9 æããããã³ã®ããŒãºçŒã,549,499,2.0 ãã«ã¯ãžã§ã©ãŒã,100,199,0.1 ã€ã¿ãªã¢ã³ããªã³,216,249,0.1 â»å¡©åã¯ãªã«ãåºããããããšæã£ãŠå
¥ããŠã¿ãŸããããä»åã¯ãããŸã§æãåºãªãã£ãã®ã§å
šã䜿ã£ãŠããŸããã ãŸãã¯å
šæ¢çŽ¢ããå§ããŠã¿ãã ãšã¯èšã£ããã®ã®ãæ£çŽãã®å
šæ¢çŽ¢ãäœãã®ã¯ãªããªãé£ããã£ãã§ããæ¬¡ã®2ã€ãç¹ã«é£ããã£ãç¹ã§ãã ååž°ã§ãããšããããšãæãæµ®ãã°ãªãã£ããåºæ¥ãªãæ°ããã 2^(ã¡ãã¥ãŒã®æ°) åforæãåããŠãbitã§ãããšããªã®ã§ãããã... ååž°ã§ãããšãªã£ãŠããåŒæ°ãã©ãããã®ããã©ããã颿°ã«ããã®ããé£ãã ã«ããªãŒã¯åŒæ°ãšããŠåããªããŠããã®ã nåç®ãŸã§é£ã¹ããšãããªã®ããnåç®ä»¥éãªã®ã å
šæ¢çŽ¢ã¯ååž°ã䜿ããšããã€ã¡ãŒãžããã£ãã®ã§ãè²ã
èŠãªãããªããšãäœã£ãŠã¿ãŸããã ä»åã¯ãn=0ããå§ããŠãn+1åç®ä»¥éã®ã¡ãã¥ãŒã ãã§éžãã ãšãã«åŸãããã«ããªãŒãè¿ã颿°ãšããŠèããŠã¿ãŸãããããã°ã©ã ã¯ä»¥äžã®ãšããã§ãã ã³ãŒã # ãã¡ã€ã«ã®èªã¿èŸŒã¿ with open('menu.csv') as fi: menu = fi.readlines() for i in range(len(menu)): menu[i] = menu[i].strip().split(",") for j in range(1,3): menu[i][j] = int(menu[i][j]) menu[i][3] = float(menu[i][3]) yosan = 1000 # n+1åç®ä»¥éã®ã¡ãã¥ãŒã§åŸãããæå€§ã®ã«ããªãŒãæ±ãã颿° # 1åç®ã¯menu[0]ãªã®ã§æ¥æ¬èªãšãããŠãã def zentansaku(n,ryoukin): # ããæçãæ®ã£ãŠããªããã°ã«ããªãŒã¯åŸãããªã if n == len(menu): return 0 # menu[n]ã®æéãäºç®å
ã§ããã°ãmenu[n]ãé£ã¹ãå Žåãšé£ã¹ãªãã£ãå Žåã確ããã if ryoukin + menu[n][2] <= yosan: taberu = zentansaku(n + 1, ryoukin + menu[n][2]) + menu[n][1] # [1]ã¯ã«ããªãŒ [2]ã¯æé tabenai = zentansaku(n + 1, ryoukin) if taberu >= tabenai: return taberu else: return tabenai else: tabenai = zentansaku(n + 1, ryoukin) return tabenai print(zentansaku(0,0)) # 1åç®ãã0å䜿ã£ãç¶æ
ã§ã®æå€§ã®ã«ããªãŒãæ±ãã åºåçµæ 1498 ãããŸãããååž°ã䜿ã£ãŠã®å
šæ¢çŽ¢ã¯åºæ¥ãŸããããã®ã¡ãã¥ãŒãé£ã¹ããé£ã¹ãªããã§ãmaxã䜿ããã«ããã¡ãã¡`taberu`, `tabenai`ã«ä»£å
¥ããã®ã¯ãããããã®å€ãäœãæãã®ãäžæŠæŽçããŠã¿ãããšæã£ãããæ¥æ¬èªã«è¿ã¥ããŠã¿ãããšæã£ããšããæå³ããããŸãã ç¶ããŠããã®å
šæ¢çŽ¢ãé«éåããã¡ã¢åãããã¯ããªãçŽæçãªææ³ã§ãããã«çè§£ã§ããã®ã§å®è£
ããŠã¿ãŸãããããŸãã«ãååž°é¢æ°ãã©ã®ããã«èªåãåŒã³åºããŠããã®ããããã°ã©ã ã®ã©ãã蟿ã£ãŠããã®ããèŠãŠã¿ãããšæã£ãŠè²ã
åºåããŠã¿ãŸããããã以äžã®ã³ãŒãã§ã¯ãã¡ã€ã«èªã¿èŸŒã¿ã®éšåã¯çç¥ããŸãã ã³ãŒã # (ãã¡ã€ã«èªã¿èŸŒã¿éšåã¯çç¥) yosan = 1000 # ã¡ã¢çšã®é
å memo = [[-1 for i in range(yosan+1)] for j in range(len(menu)+1)] def zentansaku(n,ryoukin): indent = " " * (n + 1) # ã¡ã¢ãããŠãããã®å€ãå©çšãã if memo[n][ryoukin] != -1: return memo[n][ryoukin] if n == len(menu) - 1: return 0 if ryoukin + menu[n][2] <= yosan: print(indent,"| é£ã¹ãŠã¿ã",n,ryoukin,menu[n][2]) taberu = zentansaku(n + 1, ryoukin + menu[n][2]) + menu[n][1] print(indent,"| é£ã¹ãªã",n,ryoukin) tabenai = zentansaku(n + 1, ryoukin) if taberu >= tabenai: # ã¡ã¢ã«èšé² memo[n][ryoukin] = taberu print(indent,"[b]",menu[n][0],"ãé£ã¹ããïŒ ret:",taberu," / ",n,ryoukin,menu[n][2]) return taberu else: print(indent,"[!]",menu[n][0],"ãé£ã¹ãªãã»ããããããé£ã¹ããããã ... ret:",tabenai, " / ", n,ryoukin,menu[n][2]) # ã¡ã¢ã«èšé² memo[n][ryoukin] = tabenai return tabenai else: print(indent,"| é£ã¹ãããªã(ãéããªã)",n,ryoukin) tabenai = zentansaku(n + 1, ryoukin) # ã¡ã¢ã«èšé² memo[n][ryoukin] = tabenai print(indent,"[x] ãéããªãã®ã§",menu[n][0],"ã¯é£ã¹ãããªã...ret:",tabenai," / ",n,ryoukin,menu[n][2]) return tabenai print(zentansaku(0,0)) åºåçµæ | é£ã¹ãŠã¿ã 0 0 299 | é£ã¹ãŠã¿ã 1 299 599 | é£ã¹ãããªã(ãéããªã) 2 898 | é£ã¹ãããªã(ãéããªã) 3 898 | é£ã¹ãããªã(ãéããªã) 4 898 | é£ã¹ãããªã(ãéããªã) 5 898 | é£ã¹ãããªã(ãéããªã) 6 898 | é£ã¹ãããªã(ãéããªã) 7 898 | é£ã¹ãããªã(ãéããªã) 8 898 | é£ã¹ãããªã(ãéããªã) 9 898 | é£ã¹ãããªã(ãéããªã) 10 898 | é£ã¹ãããªã(ãéããªã) 11 898 | é£ã¹ãããªã(ãéããªã) 12 898 | é£ã¹ãããªã(ãéããªã) 13 898 | é£ã¹ãããªã(ãéããªã) 14 898 [x] ãéããªãã®ã§ ãã«ã¯ãžã§ã©ãŒã ã¯é£ã¹ãããªã...ret: 0 / 14 898 199 [x] ãéããªãã®ã§ æããããã³ã®ããŒãºçŒã ã¯é£ã¹ãããªã...ret: 0 / 13 898 499 [x] ãéããªãã®ã§ åçåµã®ãã©ã颚ããªã¢ ã¯é£ã¹ãããªã...ret: 0 / 12 898 368 [x] ãéããªãã®ã§ ãã©ã颚ããªã¢ ã¯é£ã¹ãããªã...ret: 0 / 11 898 299 [x] ãéããªãã®ã§ ããŒããœãŒã¹ãããã¢é¢š ã¯é£ã¹ãããªã...ret: 0 / 10 898 399 [x] ãéããªãã®ã§ ã¢ã©ãã¢ãŒã¿ ã¯é£ã¹ãããªã...ret: 0 / 9 898 399 [x] ãéããªãã®ã§ ãã³ãã§ãã¿ã®ãã¶ ã¯é£ã¹ãããªã...ret: 0 / 8 898 399 [x] ãéããªãã®ã§ ãã«ã²ãªãŒã¿ãã¶ ã¯é£ã¹ãããªã...ret: 0 / 7 898 399 [x] ãéããªãã®ã§ ãã§ãªãœãŒ(èŸå³ãœãŒã»ãŒãž) ã¯é£ã¹ãããªã...ret: 0 / 6 898 399 [x] ãéããªãã®ã§ èŸå³ããã³ ã¯é£ã¹ãããªã...ret: 0 / 5 898 299 [x] ãéããªãã®ã§ ããã·ã¥ãŒã(ãã«ãç£çæçãã ) ã¯é£ã¹ãããªã...ret: 0 / 4 898 399 [x] ãéããªãã®ã§ ãã¬ãã·ã¥ããŒãºãšãããã®ãµã©ã ã¯é£ã¹ãããªã...ret: 0 / 3 898 299 [x] ãéããªãã®ã§ ã»ãããèã®ãœã㌠ã¯é£ã¹ãããªã...ret: 0 / 2 898 189 | é£ã¹ãªã 1 299 | é£ã¹ãŠã¿ã 2 299 189 | é£ã¹ãŠã¿ã 3 488 299 | é£ã¹ãããªã(ãéããªã) 4 787 | é£ã¹ãããªã(ãéããªã) 5 787 | é£ã¹ãããªã(ãéããªã) 6 787 | é£ã¹ãããªã(ãéããªã) 7 787 --------------------(ç¥)-------------------- [b] ãã³ãã§ãã¿ã®ãã¶ ãé£ã¹ããïŒ ret: 1355 / 8 0 399 [!] ãã«ã²ãªãŒã¿ãã¶ ãé£ã¹ãªãã»ããããããé£ã¹ããããã ... ret: 1355 / 7 0 399 [!] ãã§ãªãœãŒ(èŸå³ãœãŒã»ãŒãž) ãé£ã¹ãªãã»ããããããé£ã¹ããããã ... ret: 1355 / 6 0 399 [b] èŸå³ããã³ ãé£ã¹ããïŒ ret: 1498 / 5 0 299 [!] ããã·ã¥ãŒã(ãã«ãç£çæçãã ) ãé£ã¹ãªãã»ããããããé£ã¹ããããã ... ret: 1498 / 4 0 399 [!] ãã¬ãã·ã¥ããŒãºãšãããã®ãµã©ã ãé£ã¹ãªãã»ããããããé£ã¹ããããã ... ret: 1498 / 3 0 299 [!] ã»ãããèã®ãœã㌠ãé£ã¹ãªãã»ããããããé£ã¹ããããã ... ret: 1498 / 2 0 189 [!] åçåµãšããŒã¯ã®ãµã©ã ãé£ã¹ãªãã»ããããããé£ã¹ããããã ... ret: 1498 / 1 0 599 [!] ããããããã³ã®ãµã©ã ãé£ã¹ãªãã»ããããããé£ã¹ããããã ... ret: 1498 / 0 0 299 1498 ãã£ããŒãããããµãã¯åé¡è§£ããïŒãšæããŸããããä»åã®äž»ç®çã¯DPãçè§£ããããšã§ãããæ£çŽå
šæ¢çŽ¢ãè²ã
èŠããèŠãŸãã§æžããã®ã§ãããæ
£ãããŸã§ã¯å€©äžãçã«ãšãããããã£ãŠã¿ãŠããŸãã¯çè§£ãæ·±ããããã®ããã§èœã¡çããŠèããŠèªåã§çŽåŸã§ããããã«ããŠããããšæããŸããã ã¡ãããšDPã§è§£ãã DPã«ã€ããŠå匷ããç§ãæãDPã®è ããç¶æ
ãããã®åã®ç¶æ
ã®çµã¿åããã§è¡šããããã®ã§ããã°ããã®ç¶æ
ãæŒžååŒã«ããŠè¡šããŠããããããã°ã©ã ã«èœãšã蟌ãã°ãDPã«ãªã DPã¯ååž°ã§ã¯ãªãforæã䜿ã£ãŠè¡šãé çªã«åããŠãããã® ã³ãŒã # (ãã¡ã€ã«èªã¿èŸŒã¿éšåã¯çç¥) yosan = 1000 # dp[i][j] = içªç®ãŸã§ã®åã䜿ã£ãŠ jå䜿ã£ãæã® æå€§ã«ããªãŒ # menuã®æ·»åãšéã£ãŠãããããã®ã¯ãdp[0]ãäœãé£ã¹ãªããšããšããã®ã§ã # dp[i][j]ã®iãšæ¥æ¬èªã®içªç®ã察å¿ããããšã§ããã # ãã©ãããã§ããããiçªç®ã®å = menu[i-1]ã§ããã # ex: dp[3][500]ã¯3ã€ç®ãŸã§(=menuã®0~2)ã®ååã䜿ã£ãŠã500åãŸã§äœ¿ããæã®æå€§ã«ããªãŒãæã dp = [[-1 for i in range(yosan + 1)] for j in range(len(menu) + 1)] for i in range(len(dp[0])): # åææ¡ä»¶ / 0çªç®ã®ååãŸã§ã䜿ã = äœãé£ã¹ãããªã = äœå䜿ã£ãŠã0ã«ããªãŒ dp[0][i] = 0 # menu[n]ã䜿ã£ãŠã priceå䜿ã£ãæã®æå€§ã«ããªãŒãé çªã«æ±ããŠãã for n in range(len(menu)): for price in range(yosan + 1): # tabeta = n-1ãŸã§ã®menuãš, price - menu[n][2]åã®ç¶æ
ããã menu[n]ãé£ã¹ãå Žå # tabenai = n-1ãŸã§ã®menuãš, priceåã®ç¶æ
if price - menu[n][2] >= 0: tabeta = dp[n][price - menu[n][2]] + menu[n][1] tabenai = dp[n][price] if tabeta >= tabenai: dp[n + 1][price] = tabeta else: dp[n + 1][price] = tabenai # priceãããããmenu[n][2]ãããå®ãã£ãããmenu[n]ãé£ã¹ããšããéžæè¢ã¯ãªãã®ã§ã1ã€åã®priceããã®ãŸãŸäœ¿ãã»ããªã else: dp[n + 1][price] = dp[n][price] # æ±ããçãã¯len(menu)çªç®ãŸã§ã®ååã䜿ããyosanåãŸã§äœ¿ããæã®æå€§ã«ããªãŒã print(dp[len(menu)][yosan]) # dpã®ããŒãã«ãåºåããŠã¿ã # 暪ã«yosanåãããšèŠã¥ããã®ã§ã50åå»ã¿ã§åºåãã temp = [] for i in range(0,yosan + 1,50): # :ãæžåŒæå®ãè¡ãããã®èšå·(æŒç®å?)ã_ãåããæåã<ãå·Šåããæ°åãæ¡æ° temp.append('{:_<4}'.format(i)) for a in dp: temp = [] for i in range(0,len(a),50): temp.append('{:>4}'.format(a[i])) # >ã¯å³åã(^ã¯äžå€®å¯ã) print(" ".join(temp)) åºåçµæ 確ãã«äžã®ã¡ã¢åååž°ãšåãçããåºåãããŸããïŒdpã®è¡šããªãã ãããããããªã£ãŠããŠéææããããŸãã åœåã®çåç¹ãšä»ã®çè§£ [Q1] ãªãã§ããããªããããªæéãŸã§foræãåããªããšãããªãã®ããäŸãã°50åãš100åã®ã¡ãã¥ãŒãããªããã°ã49åã®ç¶æ
ãšãååšããªãã®ã§ã¯ïŒ [A1] ããã¯ããã ãã©ãç¡é§ã«ãªãã ãã§ãå®å®³ã¯ãªããéã«ãäºç®ãã«ããªãŒã倧ãããšã倧ãã衚ãäœããªããšãããªããªãã®ã§å³ããããã®å Žåã¯ãããããã工倫ããå¿
èŠããããããããªãã [Q2] dpã®è¡šããããããšããã®ã¯ã©ããã£ããæãæµ®ãã¶ã®ãã [A2] æ
£ããªã®ã§ã¯ãªããã [Q3] ããåé¡ã«å¯ŸããŠè¡šã®äœãæ¹ã¯äžéããããªãã®ãã [A3] æãããããªããšã¯ãªããäœãªãããã®åé¡ã§ãäžèšãããã衚ã®äœãæ¹ãããå¯èœæ§ã¯ãããå¶çŽã«å¿ããŠè¡šã®æã¡æ¹ã工倫ãããšããããšã¯æ±ããããã®ãããããªãã ææ³ çµå±ãããããµãã¯åé¡ãšããã®ã¯ã dp[i][j] ãã©ãäœãããšããã²ãŒã ãªã®ã§ã¯ããšããããšãšãã©ããã£ãŠæŒžååŒãäœããããšããããšã«ããã£ãŠããã®ã§ã¯ãªãããšããããšã«ãæ¹ããŠæ°ã¥ããŸããã(ãããæãã€ãããè§£ãããã ãããããããæãã€ããªããã§ãããšèšãããã) ããããªãããä»åãæŒžååŒãæãã€ãããdpã§åé¡ãè§£ããããã«ãªã£ãããšã¯ãäžã€å€§ããåç©«ã ãšæã£ãŠããŸãã0-originãšãæ¥æ¬èªã®ïœçªç®ã§ãã£ãããdpã®æ·»åãšããªããªãããŸãæããªãã£ãã®ãé£ãã/ãã¹ãèµ·ããããªãã€ã³ãã ãªãšæããŸãããååŠçã§ããŸãæããŠè§£ãã¹ãã ã£ããããããŸããã ããšãçµå±åºåãããã«ããªãŒãåãã«ã¯ãäœãé£ã¹ãã°ããã®ããšããã®ãããããªããªãšæã£ãŠããŸãã瀟å
ã®ç«¶ãã匷ã人ã«èãããæ¹æ³ã¯ããããã§ããããä»åã¯äžæŠãããŸã§ãšããŠãããã«ã€ããŠãèããŠãããããªãšæããŸãã ä»åã¯åãã¡ãã¥ãŒãé ŒãŸãªããšããçžãã§ããããåãã¡ãã¥ãŒãé Œããšãããã©ãããã®ããåæ°å¶éããã£ããã©ããªãã®ãããšãããäºç®å
ã§ ã«ããªãŒ/å ãæå€§ã«ãªãã®ã¯ããšããã®ã¯äžçª ã«ããªãŒ/å ã®é«ããã®ãé Œãã ãã«ãªããããªã®ã§ãéè€ç¡ãã§må以äžé Œããšãã®ããšããå¶çŽæ¡ä»¶ãä»ãããšã©ããªãã®ãããšãè²ã
è§£ããŠã¿ãããªããŸããã èªåã«ã¯äžççè§£åºæ¥ãªããã®ãšããŠDPãæ±ã£ãŠããŸããããä»å芪ãã¿ãæãŠãŸãããçŸã«ã調ã¹ãäžã§ æé·å
±ééšåå ãšããåé¡ãDPã䜿ããšç¥ããèå³ãæã£ãŠèª¿ã¹ãŸãããåé¡ãèŠããšãã¯ã©ããã£ãŠDPã䜿ãã®ãæãæµ®ãã³ãŸããã§ãããã解説ãèŠãŠãããšããåæã«ãã®è§£èª¬ãåããããã«ãªã£ãŠããããšã«æ°ã¥ããŠéåžžã«å¬ãããªããŸããããã€ããDPã䜿ãåé¡ããããã¯DPã§è§£ãåé¡ã ïŒãšæ°ã¥ããŠãACåããããšã倢èŠãŠããããããç«¶ãããé 匵ããããšæããŸãã