λ°±μ€_11048_μ΄λνκΈ°
πβοΈ λ¬Έμ
https://www.acmicpc.net/problem/11048
11048λ²: μ΄λνκΈ°
μ€κ·λ N×M ν¬κΈ°μ λ―Έλ‘μ κ°νμλ€. λ―Έλ‘λ 1×1ν¬κΈ°μ λ°©μΌλ‘ λλμ΄μ Έ μκ³ , κ° λ°©μλ μ¬νμ΄ λμ¬μ Έ μλ€. λ―Έλ‘μ κ°μ₯ μΌμͺ½ μ λ°©μ (1, 1)μ΄κ³ , κ°μ₯ μ€λ₯Έμͺ½ μλ« λ°©μ (N, M)μ΄λ€. μ€κ·λ
www.acmicpc.net
𧩠μκ³ λ¦¬μ¦
λ€μ΄λλ―Ή νλ‘κ·Έλλ° (DP)
π‘ μμ΄λμ΄
D[i][j] = (1, 1)μμ μμν΄μ (i, j)μ λμ°©νμ λ μ¬ν κ°μμ μ΅λκ°.
(i, j)μ λμ°©νμ λ κ°λ₯ν κ²½μ°μ μ (D[i][j]λ₯Ό λ§λ€ μ μλ λ°©λ² 3κ°μ§):
case 1) (1, 1) → (i, j - 1) → (i, j) μ΄λ, D[i][j] = D[i][j - 1] + A[i][j]
case 2) (1, 1) → (i - 1, j) → (i, j) μ΄λ, D[i][j] = D[i - 1][j] + A[i][j]
case 3) (1, 1) → (i - 1, j - 1) → (i, j) μ΄λ, D[i][j] = D[i - 1][j - 1] + A[i][j]
→ D[i][j] = max(case 1, case 2, case 3) + A[i][j]
νμ§λ§, λκ°μ μ΄λμ μ€λ₯Έμͺ½→μλ / μλ→μ€λ₯Έμͺ½ λ λ°©λ²λ³΄λ€ νμ μ¬ν κ°μκ° μ κ±°λ κ°μΌλ―λ‘ κ³ λ €νμ§ μμλ λ¨ (A[i][j] ≥ 0 μΌ λλ§). λ°λΌμ, case 3 μ μ κ±° κ°λ₯.
π©π» μ½λ
#include <iostream>
#include <algorithm>
using namespace std;
int a[1001][1001];
int d[1001][1001];
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// input
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
// dp
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
d[i][j] = max(d[i - 1][j], d[i][j - 1]) + a[i][j];
}
}
// output
cout << d[n][m] << '\n';
return 0;
}