9184λ² - μ λλ ν¨μ μ€ν
λ¬Έμ μ μ£Όμ΄μ§ μ½λλ₯Ό μ€νμν€λ €κ³ νλλ°
λ¬Έμ μμ ν΄λΉ μ½λλ₯Ό μ€νμν€λ©΄ μκ°μ΄ λ무 μ€λ걸릴κΉλ΄ κ±±μ μ΄λλλ€.
ν΄λΉ μ½λλ₯Ό μκ°μ΄κ³Όκ° λμ§ μκ² μ€νμν€λ μ½λλ₯Ό μμ±νλ©΄ λ©λλ€.
...보μλ§μ μ§μμ΄ κ°λλ€. DPμ λ©λͺ¨μ΄μ μ΄μ κΈ°λ²μ μ¬μ©νλ©΄ λ©λλ€.
λ³΄ν΅ ν©ν 리μΌκ°μλ°μ λ©λͺ¨μ΄μ μ΄μ μ μ¬μ©νλ©΄ λ³μλ₯Ό νλλ§ λ°μμ memo[ν΄λΉλ³μ] λΌλ μ©μΌλ‘ κΈ°λ‘νλλ° μ΄λ²μλ λ³μκ° λ¬΄λ € μΈ κ°μ λλ€.
λ³΄κ³ λ± λ μ€λ₯Έ μκ°μ 3μ°¨μ 리μ€νΈλ‘μ¨ memo[a][b][c] λ‘ κ΅¬ννλκ² μ ν΄κ² ꡬλ μκ°νμ΅λλ€.
κ·Έλ¬λ μ λ λ¨λ€κ³Ό κ°μ κΈΈμ κ±·κΈ°λ μ«μ΄ μ‘°κΈ μ°½μμ μΌλ‘ ꡬνν΄λ΄€μ΅λλ€.
μΌλ¨ λ©λͺ¨μ΄μ μ΄μ μΌλ‘μ¨ λμ λ리λ₯Ό νλ λ§λ€κ³ , 3κ° λ³μλ₯Ό λ¬Άμκ±°
(μλ₯Ό λ€μ΄ w(20,20,20) μ΄λΌλ©΄ dict['202020'] = ν΄λΉ μ¬κ·λ¬Έ (w(20,20,20)μ΄λΌλκ° w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c) μ κ°μ λ±λ±...) )
μ κ°μ νμμΌλ‘ λμ λ리λ₯Ό ꡬμ±ν΄μ€ ν
if str(a)+str(b)+str(c) in memo.keys():
return memo[str(a)+str(b)+str(c)]
ν΄λΉ κ°μ΄ keyκ°μ μ‘΄μ¬νλ€λ©΄ ν΄λΉ κ°μ keyμ ν΄λΉνλ valueλ₯Ό λ΄λ³΄λ΄λ μμΌλ‘ ꡬνν΄λ λ κ² κ°μμ΅λλ€.
while True:
a,b,c = map(int,input().split())
if a==-1 and b==-1 and c==-1:
break
print('w(%s, %s, %s) ='%(a,b,c),w(a,b,c))
λ¨Όμ λ¬Έμ μμ -1,-1,-1μ΄ λ€μ΄μ€λ©΄ μ λ ₯μ λ©μΆκ³ κ·Έ μ κΉμ§λ μΆλ ₯νλΌ νμΌλ―λ‘ μμ κ°μ΄ μΆλ ₯ νμμ λ§μΆμ΄ μ½λ©ν΄μ€λλ€.
memo = dict()
def w(a,b,c):
λ€μμΌλ‘ λ©λͺ¨μ΄μ μ΄μ μΌλ‘μ¨ λμ λ리λ₯Ό νλ μ μΈνκ³ wν¨μ μ μμ μμν©λλ€.
if str(a)+str(b)+str(c) in memo.keys():
return memo[str(a)+str(b)+str(c)]
μκΉ λ§νλλ‘ νμ¬ νμμ€μΈ κ°μ΄ λ©λͺ¨μ΄μ μ΄μ μ ν€κ°μ μμΌλ©΄ ν΄λΉ value κ°μΌλ‘ return ν΄μ€μλ€.
if a>20 or b>20 or c>20:
memo[str(a)+str(b)+str(c)] = w(20,20,20)
return memo[str(a)+str(b)+str(c)]
λλ¨Έμ§λ λ¬Έμ μ λμ¨ μ½λ κ·Έλλ‘ μμ±νλ λ©λͺ¨μ΄μ μ΄μ κΈ°λ²μ μ¬μ©ν μ μκ² λ©λͺ¨μ΄μ μ΄μ μ λ£μ΄ ν΄λΉ λ©λͺ¨μ΄μ μ΄μ κ°μΌλ‘ return ν΄μ£Όλλ‘ ν©μλ€.
if a>20 or b>20 or c>20:
memo[str(a)+'empty'+str(b)+'empty'+str(c)] = w(20,20,20)
return memo[str(a)+'empty'+str(b)+'empty'+str(c)]
if a<b and b<c:
memo[str(a)+'empty'+str(b)+'empty'+str(c)] = w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c)
return memo[str(a)+'empty'+str(b)+'empty'+str(c)]
else:
memo[str(a)+'empty'+str(b)+'empty'+str(c)] = w(a-1,b,c) + w(a-1,b-1,c) + w(a-1,b,c-1) - w(a-1,b-1,c-1)
return memo[str(a)+'empty'+str(b)+'empty'+str(c)]
λλ¨Έμ§λ λμΌν λ°©μμΌλ‘ μμ±νλ©΄ λ©λλ€.
μ΄μ μΆλ ₯ν΄λ³΄λκΉ
κ°μ μλμ€λλ°
μμ μλ μ΄μ λ‘ ν립λλ€.
κ³°κ³°ν μκ°ν΄λ³΄λκΉ λ©λͺ¨μ΄μ μ΄μ μμ±μ ν λ w(11,11,11)κ³Ό κ°μ νμμ κΈ°μ¬λ°κ² λλ©΄ memo['111111']μ΄ λλλ°
μ΄κ² λμ€μ λ©λͺ¨ μ°Έκ³ λ₯Ό ν λ w(1,111,11)μ΄λ, w(1111,1,1)μ΄λ ꡬλΆν λ°©λ²μ΄ μκΈ° λλ¬Έμ λλ μ€λ₯λΌκ³ μκ°μ΄ λ©λλ€.
κ·Έλμ w(a,b,c)μ¬μ΄λ₯Ό ꡬλΆν΄μ€ λ¬Έμλ₯Ό μ무거λ νλ λ£μ΄μ£ΌκΈ°λ‘ νμ΅λλ€.
memo = dict()
def w(a,b,c):
if a<=0 or b<=0 or c<=0:
return 1
if str(a)+'empty'+str(b)+'empty'+str(c) in memo.keys():
return memo[str(a)+'empty'+str(b)+'empty'+str(c)]
if a>20 or b>20 or c>20:
memo[str(a)+'empty'+str(b)+'empty'+str(c)] = w(20,20,20)
return memo[str(a)+'empty'+str(b)+'empty'+str(c)]
if a<b and b<c:
memo[str(a)+'empty'+str(b)+'empty'+str(c)] = w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c)
return memo[str(a)+'empty'+str(b)+'empty'+str(c)]
else:
memo[str(a)+'empty'+str(b)+'empty'+str(c)] = w(a-1,b,c) + w(a-1,b-1,c) + w(a-1,b,c-1) - w(a-1,b-1,c-1)
return memo[str(a)+'empty'+str(b)+'empty'+str(c)]
while True:
a,b,c = map(int,input().split())
if a==-1 and b==-1 and c==-1:
break
print('w(%s, %s, %s) ='%(a,b,c),w(a,b,c))
λ¨μν aμbμ¬μ΄, κ·Έλ¦¬κ³ bμ cμ¬μ΄ λ©λͺ¨μ΄μ μ΄μ μ μνν μ°Έκ³ λ μ μλλ‘ 'empty'λΌλ λ¬Έμμ΄μ λ£μ΄ ꡬλΆν΄μ£ΌκΈ°λ‘ νμ΅λλ€.
11057λ² - μ€λ₯΄λ§ μ
μμ κ°μ΄ μ리μκ° μ£Όμ΄μ‘μ λ ν΄λΉ μ리μμμ λμ¬ μ μλ μ€λ₯΄λ§ μκ° λμ€λ κ²½μ°λ₯Ό λͺ¨λ ꡬνλ λ¬Έμ μ λλ€.
μΌλ¨ μ μμ 0,1,2,3,4,5,... λ λ§μ§λ§ μλ¦Ώμμ
λλ€.
κ·Έλ¬λκΉ μμ μ리μκ° 1μ΄λΌλ©΄ 0μΌλ‘ λλλ μ€λ₯΄λ§ μλ 1κ° (0), μμ μ리μκ° 2λΌλ©΄ 1λ‘ λλλ μ€λ₯΄λ§ μλ 2κ°(μκ° 0μΌλ‘ μμν μ μλμΌλκ° 00,01) μ΄λ° μ©μ
λλ€.
μ΄λ κ² μ λμ΄ν΄λ³΄λ©΄ κ·μΉμ±μ΄ 보μ
λλ€.
μμ νκΈ°ν΄λ 3μ리μμ 2λ‘ λλλ μ(6) = 3μ리μμ 1λ‘ λλλ μ(3) + 2μ리μμ 2λ‘ λλλ μ(3)
λΌλ κ·μΉμ±μ μ°Ύμλ³Ό μ μμ΅λλ€.
μ΄κ±Έ ν λλ‘ μ νμμ μΈμ보면
Nμ리μμ iλ‘ λλλ μ = Nμ리μμ i-1λ‘ λλλ μ + N-1μ리μμ iλ‘ λλλ μ
μ΄λ° νμμΌ κ²λλ€.
DPλλλλ‘ 1μ리μλ μ£λ€ μ΄κΈ° κ³ μ μΌλ‘ λ°μλκ³ , 2μ리μλΆν°λ μ μ νμμ κΈ°λ°μΌλ‘ νμ΄νλ©΄ λ κ² κ°μ΅λλ€.
dp = [[0]*10 for _ in range(1001)]
N = int(input())
μ리μλ 1001κΉμ§ λμ¬ μ μλ€λκΉ 0~9(λλλ μ) X 1001 μ§λ¦¬ μ΄μ°¨μ 리μ€νΈλ₯Ό DPλ°°μ΄λ‘μ¨ μ μν΄μ£Όκ² μ΅λλ€. κ·Έλ¦¬κ³ Nμ리μλ₯Ό λ°μ΅λλ€.
for i in range(10):
dp[1][i] = 1
DPλ₯Ό μ°κΈ°μν μ΄κΈ° κ³μ°μ 1μ리μλ₯Ό μ λΆ 1λ‘ μ΄κΈ°νν΄μ€μλ€.
for i in range(2,N+1):
for j in range(10):
dp[i][j] = dp[i-1][j] + dp[i][j-1]
2μ리μλΆν°λ, 0~9κΉμ§μ λλλ μμ μκΉ μΈμ΄ μ νμ Nμ리μμ iλ‘ λλλ μ = Nμ리μμ i-1λ‘ λλλ μ + N-1μ리μμ iλ‘ λλλ μ => dp[i][j] = dp[i-1][j] + dp[i][j-1]
μ λ£μ΄μ€μλ€. μ¬κΈ°μ iλ μλ¦Ώμ, jλ λλλ μλΌκ³ μκ°νμλ©΄ λ κ² κ°μ΅λλ€.
print(sum(dp[N])%10007)
λ§μ§λ§μΌλ‘ Nμ ν΄λΉνλ λ°°μ΄ (0~9κΉμ§μ λλλ μ κΈ°λ° μ€λ₯΄λ§ μμ κ°μλ€)μ ν©μ°μ 10007λ‘ λλ κ°(λ¬Έμ 쑰건)μ μΆλ ₯νλ©΄ λ©λλ€.