μ•Œκ³ λ¦¬μ¦˜

λ°±μ€€_11048_μ΄λ™ν•˜κΈ°

shj718 2022. 8. 2. 18:30

πŸ™‹‍♀️ λ¬Έμ œ

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;
}