https://www.acmicpc.net/problem/27212
μ
μ μκΈ°λ§ λ€μμ λλ μ κΉμ€ λ¬Έμ κ° λ μ¬λλλ° κ°μκΈ° λ§μ‘±λλ₯Ό ꡬνλΌκ³ νλ€.
DPλ‘ μ κ·Όν΄μ ν΄κ²°νλ€.
dp[a][b]λ Aλν aλ² νμμ΄ Bλνμμ bλ² μ΄νμ νμκ³Ό μ
μλ₯Ό ν μ μμ λ μ»μ μ μλ μ΄λ§μ‘±λμ μ΅λκ°μΌλ‘ μ νλ€.
λ§μ΄ μ΄μνλ°, μλ₯Ό λ€μ΄ λ¬Έμ μ μμ λ₯Ό μ΄μ§ λ³νν΄μ μλμ κ°μ μ‘°κ±΄μ΄ μλ€κ³ μΉμ.
W = | 10 1 |
| 1 10 |
A = [1, 2]
B = [1, 2, 2]
dp[1][1]μ Aνκ΅ 1λ² νμμ΄ Bνκ΅ 1λ² μ΄νμ νμκ³Ό μ
μλ₯Ό ν μ μμ λ μ»μ μ μλ λ§μ‘±λμ μ΅λκ°μ΄λ€.
μ
μλ₯Ό μ νλ©΄ λ§μ‘±λλ 0, Bνκ΅ 1λ² νμκ³Ό μ
μλ₯Ό νλ€λ©΄ λ§μ‘±λλ 10μ΄ λ κ²μ΄λ€.
λ°λΌμ dp[1][1] = 10μ΄λ€.
dp[1][2]λ Aνκ΅ 1λ² νμμ΄ Bνκ΅ 2λ² μ΄νμ νμκ³Ό μ
μλ₯Ό ν λ μ»μ μ μλ λ§μ‘±λμ μ΅λκ°μ΄λ€.
Bνκ΅ 2λ²κ³Ό μ
μλ₯Ό νλ€λ©΄ λ§μ‘±λλ 1μ΄ λΌλ²λ¦¬λ κ·Έλ₯ 1λ² νμκ³Ό μ
μνλ νΈμ΄ λ«λ€.
λ°λΌμ dp[1][2] μμ 10μ΄λ€. dp[1][3]λ λ§μ°¬κ°μ§λ‘ 10μ΄λ€.
Aνκ΅ 1λ² νμμ΄ μ
μλ₯Ό λ§μ³€μΌλ 2λ² νμμΌλ‘ λμ΄κ°λ€.
μ
μνλ©΄μ νμ΄ κ²ΉμΉλ©΄ μ λλ dp[2]λ dp[1]μ λΉν΄ μΆκ°μ μΈ μ‘°κ±΄λ€μ κ³ λ €ν΄μ£Όμ΄μΌ νλ€.
dp[2][1]μ ꡬν λ κ³ λ €ν΄ μ€ κ²½μ°μ μλ λ κ°μ§ μ λμ΄λ€.
1) Aνκ΅ 1λ²μ΄ Bνκ΅ 1λ²κ³Ό μ
μ, Aνκ΅ 2λ²μ μ
μ μ ν¨ > 10
2) Aνκ΅ 1λ²μ μ
μ μ ν¨, Aνκ΅ 2λ²μ Bνκ΅ 1λ²κ³Ό μ
μ > 1
λ°λΌμ dp[2][1]μ 10μ΄λ€.
dp[2][2]λΆν°λ μΈ κ²½μ° μ€ νλμ΄λ€.
1) Aνκ΅ 2λ²μ΄ Bνκ΅ 2λ²κ³Ό μ
μν¨
> dp[2][2] = (Aνκ΅ 1λ²μ Bνκ΅ 1λ² μ΄νμ μ
μν μ΅λκ°) + (μ§κΈ μ
μμ λ§μ‘±λ) == dp[1][1] + 10 == 20
2) Aνκ΅ 2λ²μ΄ Bνκ΅ 1λ² μ΄νμ μ
μν¨
> dp[2][2] = dp[2][1] == 1
3) Aνκ΅ 2λ²μ μ
μ μ ν¨
> dp[2][2] = Aνκ΅ 1λ²μ΄ Bνκ΅ 2λ² μ΄νμ νμκ³Ό μ
μν μ΅λκ° == dp[1][2] == 10
λ°λΌμ dp[2][2]λ 20μ΄λ€.
μ΄λ° λ°©μμΌλ‘ μ κ²½μ°μ μλ₯Ό κ³ λ €ν΄μ dpλ₯Ό μ±μκ°λ©΄ λλ€.
μ€λͺ
μ΄ λμμκ³ κΈ΄λ°...
μ 리ν΄μ κ·μΉμ μ°Ύμ보μλ©΄, dp[a][b]λ ν¬κ² μΈ κ°μ§ κ²½μ° μ€ νλμ ν΄λΉν κ²μ΄λ€.
1) aλ² νμμ΄ bλ² νμκ³Ό μ
μλ₯Ό ν¨
> dp[a][b] = dp[a-1][b-1] + (aμ bκ° μ
μν λμ λ§μ‘±λ)
2) aλ² νμμ΄ bλ² λ―Έλ§μ νμκ³Ό μ
μλ₯Ό ν¨
> dp[a][b-1]
3) aλ² νμμ μ
μλ₯Ό μμ μ ν¨
> dp[a-1][b]
dp[a][b]μ 1) ~ 3) μ€ μ΅λκ°μ μ μ₯ν΄ μ£Όλ λ°©μμΌλ‘ νμλ€.
κ·Έλ λ€λ©΄ dp[N][M]μ΄ λͺ¨λ κ²½μ°μ μλ₯Ό κ³ λ €νμ λ μ»μ μ μλ λ§μ‘±λμ μ΅λκ°, μ¦ μ λ΅μ΄λ€.
N, M, C = map(int, input().split())
W = [list(map(int, input().split())) for _ in range(C)]
A = [0] + list(map(int, input().split()))
B = [0] + list(map(int, input().split()))
dp = [[0] * (M+1) for _ in range(N+1)]
for i in range(1, N+1):
for j in range(1, M+1):
dp[i][j] = max(max(dp[i-1][j-1] + W[A[i]-1][B[j]-1], dp[i][j-1]), dp[i-1][j])
print(dp[N][M])
'λ°±μ€' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λ°±μ€ 27210 μ μ λͺ¨μλ μ¬λΉ - νμ΄μ¬ (1) | 2023.01.14 |
---|---|
λ°±μ€ 27211 λλ νμ± - νμ΄μ¬ (0) | 2023.01.14 |
λ°±μ€ 1002 ν°λ - νμ΄μ¬ (2) | 2022.12.30 |
λ°±μ€ 7785 νμ¬μ μλ μ¬λ - νμ΄μ¬ (0) | 2022.12.29 |
λ°±μ€ 2839 μ€ν λ°°λ¬ - νμ΄μ¬ (0) | 2022.12.29 |