1912λ²: μ°μν©
첫째 μ€μ μ μ n(1 ≤ n ≤ 100,000)μ΄ μ£Όμ΄μ§κ³ λμ§Έ μ€μλ nκ°μ μ μλ‘ μ΄λ£¨μ΄μ§ μμ΄μ΄ μ£Όμ΄μ§λ€. μλ -1,000λ³΄λ€ ν¬κ±°λ κ°κ³ , 1,000λ³΄λ€ μκ±°λ κ°μ μ μμ΄λ€.
www.acmicpc.net
μκ³ λ¦¬μ¦ [μ κ·Ό λ°©λ²]
λ¬Έμ μμ λ€μ κ·Έλλ‘ μ μ©ν΄λ³΄λ©΄ μ΄λ λ€.
첫 λ²μ§Έ μμ λ μλμ κ°λ€. (λ°°μ΄λ‘ ννν¨)
μ¬κΈ°μ μ°μλ μλ₯Ό μ ννμ¬ λ½μλ΄λ©΄ λ€μκ³Ό κ°λ€.
λ λ²μ§Έ μμ λ₯Ό 보μ.
λ λ²μ§Έ μμ λ₯Ό 보면 index5 μ -4 λΌλ μμκ° λ€μ΄μμ§λ§ μ΄λ₯Ό ν¬ν¨νμ¬ index7κΉμ§ μ°μμΌλ‘ ννμ¬ ν©ν κ²μ΄ μ΅λκ°μμ μ μ μλ€.
μ¦, ν¬μΈνΈλ μμ μμ μκ΄μμ΄ 'μ°μμ μΌλ‘ μ νν μμ ν©'μ΄ μ΅λκ°μ΄ λλ μλ₯Ό μ°ΎμΌλ©΄ λλ κ²μ΄λ€. μ¦, λ©λͺ¨μ΄μ μ΄μ μ μ΄μ κΉμ§ νμνλ κ°κ³Ό νμ¬ μμΉμ κ°μ λΉκ΅νμ¬ ν° κ°μ μ μ₯νλ©΄ λλ κ²μ΄λ€.
Top-Down λ°©μμΈ μ¬κ·λ‘ ꡬννμλ©΄ κ°κ΄μ μΌλ‘ λ€μκ³Ό κ°λ€.
static int recur(int N) {
// νμνμ§ μμ μΈλ±μ€λΌλ©΄
if(dp[N] == null) {
// (μ΄μ λ°°μ΄μ λμ ν© + νμ¬ κ°)κ³Ό νμ¬ κ°μ λΉκ΅νμ¬ μ΅λκ°μ NμμΉμ μ μ₯
dp[N] = Math.max(recur(N - 1) + arr[N], arr[N]);
}
return dp[N];
}
λ°λλ‘ Bottom-UpμΌλ‘ νλ©΄ μ μ½λλ₯Ό λ°λ³΅λ¬ΈμΌλ‘ λ€μκ³Ό κ°μ΄ ꡬνν μ μλ€.
for (int i = 1; i < N; i++) {
dp[i] = Math.max(dp[i - 1] + arr[i], arr[i]);
}
κ·Έλ¬λ©΄ λ©λͺ¨μ΄μ μ΄μ μ΄ λ dpλ°°μ΄μλ κ° μΈλ±μ€κΉμ§μ μ΅λκ°μ΄ μ μ₯λμ΄μλ€λ μλ―Έλ€. μλ‘λ€μ΄ dp[3]μ΄λΌ νλ©΄ dp[0] ~ dp[3] μμ μ°μμΌλ‘ μ νν λΆλΆ μμ΄μ μ΅λκ°μ΄ μ μ₯λμ΄μλ€λ μλ―Έλ€.
κ·Έλ¦¬κ³ λμ dp λ°°μ΄μ μμλ€ μ€ κ°μ₯ ν° κ°μ μ°Ύμμ μΆλ ₯νλ©΄ λλ κ²μ΄λ€.
μ΄ λ dpλ°°μ΄μ μ΅λκ°μ μ λ ¬ λλ νλνλ νμνμ¬ μ°Ύμλ΄λ λ°©λ²λ μμ§λ§, μ²μλΆν° μμ μ¬κ· λλ λ°λ³΅λ¬Έμμ maxλ³μλ₯Ό νλ λμ΄ μ΅λκ°μ κ°±μ νλ κ²μ΄ λμ± ν¨μ¨μ μΌ κ²μ΄λ€.
νμ΄ λ° μ½λ
- λ°©λ² 1 : [Scanner + Top-Down]
import java.util.Scanner;
public class Main {
static int[] arr; // λ°°μ΄
static Integer[] dp; // λ©λͺ¨μ΄μ μ΄μ
ν dp
static int max; // μ΅λκ° λ³μ
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
arr = new int[N];
dp = new Integer[N];
for(int i = 0; i < N; i++) {
arr[i] = in.nextInt();
}
/*
* dp[0]μ 첫 μμλ‘ μ΄μ μ λμ΄μ νμν κ²μ΄ μκΈ° λλ¬Έμ
* arr[0] μ체 κ°μ΄ λλ―λ‘ arr[0]μΌλ‘ μ΄κΈ°ν ν΄μ€λ€.
* maxλν 첫 λ²μ§Έ μμλ‘ μ΄κΈ°ν ν΄μ€λ€.
*/
dp[0] = arr[0];
max = arr[0];
// dpμ λ§μ§λ§ indexλ N-1μ΄λ―λ‘ N-1λΆν° Top-Down νμ
recur(N - 1);
System.out.println(max);
}
static int recur(int N) {
// νμνμ§ μμ μΈλ±μ€λΌλ©΄
if(dp[N] == null) {
dp[N] = Math.max(recur(N - 1) + arr[N], arr[N]);
// ν΄λΉ dp[N]κ³Ό max μ€ ν° κ°μΌλ‘ max κ°±μ
max = Math.max(dp[N], max);
}
return dp[N];
}
}
μμ λ§νλ― νμ κ³Όμ μμ μμ maxλ³μλ₯Ό λκ³ ν΄λΉ index nμ μμΉμ μ μ₯ λ μ΅λκ°κ³Ό νμ¬ maxκ°μ λΉκ΅νλ©΄μ μ΅λκ°μ κ°±μ μν€λ κ²μ΄λ€. μ΄λ κ² νλ κ²μ΄ κ΅³μ΄ recur() νμ μ’ λ£ ν λ dpλ°°μ΄μ νμνλ©΄μ μ΅λκ°μ μ°Ύμ νμ μμ΄ recur() νμ κ³Όμ μμ ν λ²μ μ²λ¦¬ν μ μμΌλ μ’ λ ν¨μ¨μ μ΄λ€.
- λ°©λ² 2 : [Scanner + Bottom-Up]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] arr = new int[N];
int[] dp = new int[N];
for(int i = 0; i < N; i++) {
arr[i] = in.nextInt();
}
/*
* dp[0]μ 첫 μμλ‘ μ΄μ μ λμ΄μ νμν κ²μ΄ μκΈ° λλ¬Έμ
* arr[0] μ체 κ°μ΄ λλ―λ‘ arr[0]μΌλ‘ μ΄κΈ°ν ν΄μ€λ€.
* maxλν 첫 λ²μ§Έ μμλ‘ μ΄κΈ°ν ν΄μ€λ€.
*/
dp[0] = arr[0];
int max = arr[0];
for (int i = 1; i < N; i++) {
// (μ΄μ dp + νμ¬ arrκ°) κ³Ό νμ¬ arrκ° μ€ ν° κ²μ dpμ μ μ₯
dp[i] = Math.max(dp[i - 1] + arr[i], arr[i]);
// μ΅λκ° κ°±μ
max = Math.max(max, dp[i]);
}
System.out.println(max);
}
}