Staying Salesman

o59_oct_c1_staying

เราจะแก้โจทย์ข้อนี้ด้วย dynamic programming

ให้ dp[n][city][a][b][c]dp[n][city][a][b][c] แทนจำนวนวิธีในการเดินทางถ้าเซลส์แมนของเราอยู่ที่เมือง citycity มีเวลาเหลือ nn วัน และเคยไปเมือง a b และ c ก็ต่อเมื่อ a=1a = 1, b=1b = 1, c=1c = 1 ตามลำดับ มิเช่นนั้นจะเท่ากับ 00

จะได้ว่า

dp[n][city][a][b][c]=d=a,b,ci=1kcitydp[ni][d][a][b][c]dp[n][city][a][b][c] = \sum_{d = a, b, c}\sum_{i = 1}^{k_{city}}dp[n-i][d][a'][b'][c']

โดยที่ a,b,ca', b', c' คือค่า a,b,ca, b, c ที่เปลี่ยนไปจากการไป visit เมือง dd

สำหรับ base case เราจะให้

สำหรับ citycity ใด ๆ dp[0][city][a][b][c]=1dp[0][city][a][b][c] = 1 เมื่อ a=b=c=1a = b = c = 1 มิเช่นนั้น dp[0][city][a][b][c]=0dp[0][city][a][b][c] = 0

นั่นคือ เราจะลองทุก ๆ ทางที่เป็นไปได้ในการเดินออกจากเมือง citycity และลองทุก ๆ วันในการอยู่ที่เมืองนั้นที่เป็นไปได้

ขนาดของ state-space ของ dp นี้จะเท่ากับ O(n)\mathcal{O}(n) และ transition จะใช้เวลา O(n)\mathcal{O}(n) ทำให้เราได้อัลกอริธึมที่จะแก้ปัญหานี้ได้ใน O(nmax(ka,kb,kc))\mathcal{O}(n\cdot \max(k_a, k_b, k_c))