์ค๋ฒ1 : ๋์ ๊ณํ๋ฒ ๋ฌธ์ ์ด๋ค.
์๊ฐ
DFS๋ BFS๋ก๋ depth๊ฐ ๊น์ด์ ธ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค. ์ด ๋ฌธ์ ๋ ๋์ ๊ณํ๋ฒ์ผ๋ก ํ์ด์ผ ํ๋ค. ๊ทธ์ ์ต๋ ์ฌํ์ ๊ฐ์๋ง ์ถ๋ ฅํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์
์ด ๋ฌธ์ ๋ ์์น์ ๋ฐ๋ผ ๊ฐ์๊ฐ ๊ฒฐ์ ๋๋ฏ๋ก dp์ ์ธ์๋ฅผ ์ขํ์ ์์น๋ก ์ก๋ ๊ฒ์ด ์์ํ๋ค.
dp[y][x] = (y,x)์์น์์ ๊ฐ์ง ์ ์๋ ์ฌํ ๊ฐ์์ ์ต๋๊ฐ
์ ํ์
์ด ์ ์์ ๋ถํฉํ๋ ์ ํ์์ ์ด๋ค์์ผ๋ก ์งค ์ ์์๊น? ์ ํ์์ ์์์ ์ขํ ์์น์์ ์ด ์ขํ๊ฐ ๋ง๋ค์ด์ง๊ธฐ ์ํด ์ด๋ค ์ขํ์์ ์ฐ๊ด์ฑ์ด ์๋์ง๋ฅผ ํ์ธํ๋ฉด ๋๋ค. ๋ฌธ์ ์์ ํน์ ์์น์์ ๊ฐ ์ ์๋ ๋ฐฉํฅ์ ์ฐ, ์ข, ๋๊ฐ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ํน์ ์์น์์์ ์ฌํ์ ์ต๋๊ฐ์ ์ข, ์ฐ, 10์๋ฐฉํฅ ๋๊ฐ์ ์ธ ๋ฐฉํฅ์ ๊ฐ์ผ๋ก ๋ถํฐ ๋์ถ๋ ์ ์๋ค.
dp[y][x] = max(dp[y-1][x], dp[y][x-1], dp[y-1][x-1]) + input[y][x]
์ฃผ์ํ ์
(1, 1)์์ ์์ํ๋ฏ๋ก (1, 1), (1ํ, 1), (1, 1์ด)์ ์์น์์๋ 3๋ฐฉํฅ์์ ์ ๋ฐ์ดํธ๋ฅผ ํ ์ ์๋ค. ์ด ์ ์ ๊ณ ๋ คํ์ฌ ๋ถ๊ธฐ๋ฅผ ๋ง๋ค์ด ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์ด ์ข๋ค.
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int N, M;
int map[1001][1001];
int dp[1001][1001];
int main(){
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> map[i][j];
if (i == 1 && j == 1) dp[i][j] = map[i][j];
}
}
for (int y = 1; y <= N; y++) {
for (int x = 1; x <= M; x++) {
if (y == 1 && x == 1) {
continue;
} else if (y == 1){
dp[y][x] = max(dp[y][x], dp[y][x-1]);
} else if (x == 1){
dp[y][x] = max(dp[y][x], dp[y-1][x]);
} else {
dp[y][x] = max(dp[y][x], dp[y-1][x]);
dp[y][x] = max(dp[y][x], dp[y][x-1]);
dp[y][x] = max(dp[y][x], dp[y-1][x-1]);
}
dp[y][x] += map[y][x];
}
}
cout << dp[N][M] << '\n';
}