π [λ°±μ€μκ³ λ¦¬μ¦ νμ΄] Q.11048 μ΄λνκΈ° λ¬Έμ νμ΄
π λ¬Έμ
https://www.acmicpc.net/problem/11048
π μ κ·Όλ²
Q.11048 μ΄λνκΈ° λ¬Έμ νμ΄μ λλ€.
λ―Έλ‘λ₯Ό μ΄λνλ©° N,M κΉμ§ μ΄λν λ κ°μ Έμ¬ μ μλ μ¬ν κ°μμ μ΅λκ°μ ꡬνλ λ¬Έμ μ λλ€.
μ²μμλ κ·Έλν νμ μκ³ λ¦¬μ¦μΈ bfs , dfs λ₯Ό ν΅ν΄ μ κ·ΌνμΌλ μ΅λ¨κ±°λ¦¬κ° μλ
μ΅λ μ¬νμ κ°μλ₯Ό ꡬνκΈ° μν΄ λ€λ₯Έ κ²½λ‘λ₯Ό κ±°μ³ μ¨ κ²½μ°λ μ΄ν΄λ΄μΌ νκ³ κ²½μ°μ μκ° λ무 λ§μμ΅λλ€.
κ·Έλ¦¬κ³ λ―Έλ‘μ μ₯μ λ¬Όκ³Ό κ°μ λ°©ν΄λ¬Ό μμ΄ μ€λ₯Έμͺ½, μλμͺ½, λκ°μ μλ λͺ¨λ κ²½μ°λ‘
μμ§μΌμ μμΌλ―λ‘ λμ νλ‘κ·Έλλ°μ ν΅ν΄ νμ΄νμμ΅λλ€.
r,c μμΉλ‘ μ¬ λ λ°λ‘ μμμ μ€λ μΌμͺ½μμ μ€λ λκ°μ μΌμͺ½ μμμ μ€λ κ²½μ° μ€ μ΄λ―Έ
κ°μ₯ λ§μ κ°μμ μ¬νμ ν보ν μͺ½μμ μ€λ©΄ μ΅λκ°μ΄ λ©λλ€.
dp[i][j] = MAX(dp[i-1][j] , dp[i][j-1] , dp[i-1][j-1] ) + area[i][j]
κ·Έλ¬λ μ¬κΈ°μ λκ°μ κ²½μ°λ λ³Ό νμκ° μκ² λ©λλ€.
μλνλ©΄ μ΄λ―Έ μ¬νμ κ°μλ λͺ¨λ 0κ°μ΄μμ΄λ―λ‘ κ΅³μ΄ λκ°μ μΌλ‘ λΉ λ₯΄κ² λ΄λ € κ° νμ μμ΄
μ€λ₯Έμͺ½μΌλ‘ μ΄λνκ³ μλλ‘ μ΄λνλ κ²μ΄ λκ°μ μΌλ‘ μ΄λνλ κ²λ³΄λ€ λ§μ κ°μμ μ¬νμ ν보ν μ μκΈ° λλ¬Έμ λλ€.
κ·Έλμ κ²°κ΅
dp[i][j] = MAX(dp[i-1][j] , dp[i][j-1]) + area[i][j]
μμ κ°μ μ νμμΌλ‘ λ΅μ λμΆν μ μμ΅λλ€.
π» μ½λ
package problem.dynamic;
import java.io.*;
public class Main_11048 {
static int n;
static int m;
static int[][] area;
static int dp[][];
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
input();
solve();
System.out.println(dp[n-1][m-1]);
bw.flush();
bw.close();
}
public static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String in[] = br.readLine().split(" ");
n = Integer.parseInt(in[0]);
m = Integer.parseInt(in[1]);
area = new int[n][m];
dp = new int[n][m];
for (int i = 0; i < n; i++) {
String temp[] = br.readLine().split(" ");
for (int j = 0; j < m; j++) {
int num = Integer.parseInt(temp[j]);
area[i][j] = num;
}
}
}
public static void solve() {
dp[0][0] = area[0][0];
for(int i=1; i<n; i++){
dp[i][0] = dp[i-1][0] + area[i][0];
}
for(int i=1; i<m; i++){
dp[0][i] = dp[0][i-1] + area[0][i];
}
for(int i=1; i<n; i++){
for(int j=1; j<m; j++){
int maxNum = Math.max(dp[i-1][j] , dp[i][j-1] );
dp[i][j] = maxNum+area[i][j];
}
}
}
}