λ°±μ€ 1932λ² - μ μ μΌκ°ν(DP)
https://www.acmicpc.net/problem/1932
μ½λ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
// nμΈ΅μ μλ κ²½λ‘μ€ μ΅λκ° μ°ΎκΈ°
public static int findMax(int n, int[][] arr) {
int max = 0;
for(int i=0; i<n; i++)
if(arr[n-1][i] > max)
max = arr[n-1][i];
return max;
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(bf.readLine());
int[][] dp = new int[n][n];
StringTokenizer st;
// μΈ΅λ³λ‘ μ μ μ
λ ₯λ°κΈ°
for(int i=0; i<n; i++) {
st = new StringTokenizer(bf.readLine());
for(int j=0; j<=i; j++) {
dp[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i=1; i<n; i++) {
for(int j=0; j<=i; j++) {
// μΈ΅λ³λ‘ μ € μΌμͺ½μΌ λ
// -> λ°λ‘ μμΈ΅(dp[i-1][j]) κ³Ό κ·Έ μΈ΅(dp[i][j])μ ν© 1κ°μ§λ°μ μμ.
if(j == 0)
dp[i][j] = dp[i-1][j] + dp[i][j];
// μΈ΅λ³λ‘ μ € μ€λ₯Έμͺ½μΌ λ
// -> λ°λ‘ μμΈ΅(dp[i-1][j-1]) κ³Ό κ·Έ μΈ΅(dp[i][j])μ ν© 1κ°μ§λ°μ μμ.
else if(j == i)
dp[i][j] = dp[i-1][j-1] + dp[i][j];
// μΈ΅λ³λ‘ 맨μΌμͺ½, 맨μ€λ₯Έμͺ½μ΄ μλ μ€κ°μΌλ
// -> λκ°μ μΌμͺ½μ / λκ°μ μ€λ₯Έμͺ½μμμ ν© μ€ ν° κ°
else
dp[i][j] = Math.max(dp[i-1][j-1] + dp[i][j], dp[i-1][j] + dp[i][j]);
}
}
System.out.println(findMax(n, dp));
bf.close();
}
}
νμ΄
λ¬Έμ μμ λμ¨ 5μΈ΅μ κΈ°μ€μΌλ‘ 보μ.
* 첫 μΈ΅μ λ°°μ΄μ μΈλ±μ€ μμμ λ°λΌ 0μΈ΅μΌλ‘ ν΄μ 0, 1, 2, 3, 4μΈ΅μΌλ‘ νλ¨ν¨.
κ°μ₯ μΌμͺ½μ κ°(7, 3, 8, 2, 4)λ μ νν μ μλ κ²½μ°κ° 1κ°μ§ λ°μ μλ€.(μλμ¬μ§)
λ°λΌμ μΈ΅λ§λ€ jκ° 0μΌλλ λ°λ‘ μμΈ΅κ° + νμ¬μΈ΅κ°μ λν΄μ€λ€.
1μΈ΅ -> 7 + 3
2μΈ΅ -> 7 + 3 + 8
3μΈ΅ -> 7 + 3 + 8 + 2
4μΈ΅ -> 7 + 3 + 8 + 2 + 4
if(j == 0)
dp[i][j] = dp[i-1][j] + dp[i][j];
μΈ΅λ§λ€ jκ° iμΌλ(κ°μ₯ μ€λ₯Έμͺ½κ°)λ λ§μ°¬κ°μ§λ‘ μ νν μ μλ κ²½μ°κ° 1κ°μ§ λ°μ μλ€.
λ°λΌμ μΈ΅λ§λ€ jκ° iμΌλλ λκ°μ μΌμͺ½μμ κ° + νμ¬μΈ΅ κ°μ λν΄μ€λ€.
1μΈ΅ -> 7 + 8
2μΈ΅ -> 7 + 8 + 0
3μΈ΅ -> 7 + 8 + 0 + 4
4μΈ΅ -> 7 + 8 + 0 + 4 + 5
else if(j == i)
dp[i][j] = dp[i-1][j-1] + dp[i][j];
λ§μ§λ§μΌλ‘ jκ° κ°μ₯ μΌμͺ½λ μλκ³ κ°μ₯ μ€λ₯Έμͺ½λ μλ μ€κ°κ°λ€μΌλ
μΌμͺ½ λκ°μ μμ μ€λ₯Έμͺ½ λκ°μ μμμ ν© μ€ ν°κ°μ ꡬν΄μ£Όλ©΄ λλ€.
else
dp[i][j] = Math.max(dp[i-1][j-1] + dp[i][j], dp[i-1][j] + dp[i][j]);
μ λ°λ³΅λ¬Έμ΄ nμΈ΅κΉμ§ λλλ©΄,
nμΈ΅μ κ° κ°λ€μ ν΄λΉ μΈ΅μΌλ‘ μ‘΄μ¬νλ κ° μ€ μ΅λκ°μ΄ λλ€.
(4,3) μ 6μ΄λΌλ κ° κΉμ§ λνλ €λ©΄
(3,2) OR (3,3)μ κ° κΉμ§ λν κ²μ€ ν° κ°κ³Ό ν©μ ꡬν΄μΌ νλ€.
5μΈ΅μ κΈ°μ€μΌλ‘ κ° κ³Όμ μ μ΄ν΄λ³΄λ©΄ μλμ κ°λ€.
'Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€] 2579λ²: κ³λ¨ μ€λ₯΄κΈ°(DP, λμ κ³νλ²) (0) | 2020.02.21 |
---|---|
[Codeforces] 1097A: Gennady and a Card Game(brute force) (0) | 2020.02.21 |
[λ°±μ€] 15652λ²: Nκ³Ό M (4) (dfs, μ€λ³΅ν¬ν¨, λΉλ΄λ¦Όμ°¨μ) (0) | 2020.02.20 |
[Codeforces] 996A - Hit the Lottery (0) | 2020.02.20 |
[λ°±μ€] 15651λ²: Nκ³Ό M (3) (dfs, μ€λ³΅ν¬ν¨) (0) | 2020.02.19 |
λκΈ