λ¬Έμ : boj.kr/2240
λ μ§: 09/20 (κΈ)
μ±κ³΅μ¬λΆ: X [02:20:01]
μλ λ무μμ λ¨μ΄μ§λ μλλ₯Ό μ΅λ Wλ§νΌ μμ§μ¬ μ΅λν λ§μ μλλ₯Ό λ¨Ήλ λ¬Έμ μ΄λ€.
μμ νμ
μλ λ무λ κ°κ° 2κ°μ μμΉμ μκ³ , μκ° λ³λ‘ λ μ€ νλμ λ무μμ μλκ° λ¨μ΄μ§λ€. κ°μ₯ κ°λ¨νκ² μκ°ν΄λ³Ό μ μλ λ°©λ²μ μμ μμ νμμ΄λ€.
μ¬κΈ°μ μ£Όμ΄μ§λ λ³μλ₯Ό μκ°ν΄λ³΄λ©΄ μκ°, μ΄λ νμ, μμΉκ° μλ€. μλκ° μ²μμ 1 μμΉμμ μμνλκΉ ν΄λΉ μμΉλ₯Ό κΈ°μ€μΌλ‘ μ΄λ νμλ₯Ό μλͺ¨νμ§ μκ³ μ μ리μ μλλ νΉμ μ΄λ νμλ₯Ό μλͺ¨ν΄μ 1 μμΉλ‘ μ΄λνλλ λ κ°μ§ κ²½μ°μ μκ° μλ€. κ·ΈλΌ λ€μκ³Ό κ°μ΄ λ λ²μ νΈμΆμ΄ νμν¨μ μμν μ μλ€.
go(t + 1, w, 0);
go(t + 1, w-1, 1);
νλμ μμΉμμ μκ°μ νλ¦μ λ°λΌ 2κ°μ§μ κ°λλ‘ λλλκΉ ν΄λΉ λ‘μ§μ μκ° λ³΅μ‘λλ μ΅μ 2^30 μμ μ μ μλ€. μλλ©΄ wκ° μ΅λ 30μ΄κΈ° λλ¬Έμ΄λ€. μμ§μ΄μ§ μλ κ²½μ°μ μλ‘λ§ λ³΄λ©΄ Tμ μ΅λμΈ 1000κΉμ§λ κ°λ₯νλ€. 2^30(μ½ 10μ΅)λ§ ν΄λ μ΄λ―Έ λ무 ν° μμ΄κΈ° λλ¬Έμ μμ νμμΌλ‘λ λΆκ°λ₯νλ€λ κ²μ μ μ μλ€.
κ·Έλμ μκ°μ μ€μΌ λ°©λ²μ΄ μμκΉν΄μ μ§μ μμ νμμ νλ¦μ μ‘°κΈμ΄λλ§ μ«μκ°λ€.

ν΄λΉ μ¬μ§μ 보면 νΌλ³΄λμΉ μμ΄λ‘ μ²μ DPλ₯Ό λ°°μ μ λμ²λΌ ν¨μμ νΈμΆμμ κ½€λ λ§μ λΆλΆμ νλ¦μ΄ κ²ΉμΉλ€. μ΄λ₯Ό ν΅ν΄ DPλ‘ ν μ μμ κ² κ°λ€κ³ μκ°νλ€.
DP
μ²μμ 2μ°¨μ DP λ°°μ΄μμ w, tλ₯Ό κ°μ§κ³ λμ€μλ t, hλ w, hλ‘λ νλ €κ³ νμΌλ μλ λΆμ‘±μΌλ‘ νμ§ λͺ»νλ€. κ·Έλμ λ€λ₯Έ λΈλ‘κ·Έλ€μ ν΄μ€μ λ΄€λ€.. κ·Έλ¦¬κ³ , λλ§μ λ°©λ²μΌλ‘ λ€μ νλ² νΈλ κ²μ μ±κ³΅νκ³ κ·Έ νμ΄ κ³Όμ μ μ€λͺ νκ² λ€.
μΌλ¨ μλ‘μ΄ μμ λ₯Ό νλ² μκ°ν΄λ³΄μ.
3 2
2
1
1
t = 3, w = 2κ° μ£Όμ΄μ§κ³ t=1μΌ λ 2, t=2μΌ λ 1, t=3μΌ λ 1 μμΉμμ κ°κ° μλκ° λ¨μ΄μ§λ€. ν΄λΉ μμ λ₯Ό μμ νμμΌλ‘ νλ¦μ μ«μκ°λ©΄ λ€μκ³Ό κ°λ€.

μΌλ¨ μμ κ·Έλ¦Όμ ν΅ν΄μλ μ μ μλ―μ΄ ν΄λΉ λ¬Έμ μμ μ£Όμ΄μ§ λ³μλ μ΄ 3κ°μ§μ΄λ€. μλκ° λ¨μ΄μ§λ μκ°, μ΄λ νμ, μλμ μμΉ. μ¬κΈ°μ μ°λ¦¬κ° ꡬν΄μΌνλ κ²μ λ¨Ήμ μλμ κ°―μμ΄λ€. νΈμμ μλκ° λ¨μ΄μ§λ μμΉλ 1,2κ° μλ 0,1λ‘ νλ€.
t = 3, w = 2, h = 0μΌ λλ t=2, w=2, h=0κ³Ό t=2, w=1, h=1λ‘ κ²½μ°μ μλ₯Ό λλ μ μκ³ t = 2, w = 2, h = 0μΌ λλ t = 1, w = 2, h = 0κ³Ό t = 1, w= 1, h = 1μΈ κ²½μ°λ‘ λλ μ μλ€. μ΄λ₯Ό μΌλ°ννλ©΄ t, w, hμ λν΄ λλ μ μλ κ²½μ°μ μκ° (t-1, w, h)μ (t-1, w-1, h^1)μμ μ μ μλ€.
t = 0μΌ λλ μκ°μ΄ λͺ¨λ μμ§λ κ²μ΄λ―λ‘ λ¨Ήμ μ μλ μλ κ°μκ° 0μ΄λ€. κ·ΈλΌ κ°μ₯ μλ«λ¨ t = 0μΌ λ λ°νλλ μλμ κ°μλ 0μ΄λ€.
if (t <= 0) return 0;
κ·Έλ¦¬κ³ t = 1μΌ λ μλλ 1μ μμΉμμ λ¨μ΄μ§λ―λ‘ t = 1, w = 2, h = 0μμ λ¨Ήλ μλ κ°μλ 0μ΄λ€. t = 1, w = 1, h = 1μμ λ¨Ήλ μλ κ°μλ 1μ΄λ€. κ·ΈλΌ μ΄ λ κ°μ΄ λ°νλκ³ t = 2, w = 2, h = 0μμ λ κ° μ€ μ΅λκ°μ μ ννλ©΄ λλ€. μ¬κΈ°κΉμ§ μμΌλ©΄ λμΆ© μ΄λ° μ½λλ₯Ό μκ°ν μ μλ€. κ·Έλ¦¬κ³ t = 2μμ μμΉμ λ°λΌ μλλ₯Ό λ¨Ήμ μ μλ€λ©΄ +1 μλλ©΄ +0μ νλ©΄ λλ€.
if (t <= 0) return 0;
return Math.max(go(t-1, h^1, w-1), go(t-1, h, w)) + (tree[t] == h ? 1 : 0);
μ΄ νλ¦μ λ°λΌ κ³μ νκ³ μ¬λΌκ°λ€λ³΄λ©΄ μ΅λν λ¨Ήμ μ μλ μλ κ°μκ° λμ¨λ€. μ¬κΈ°μ μ΄μ DPλ₯Ό μ΄μ©ν΄μ κ²ΉμΉλ λΆλΆμ λν λ¬Έμ λ₯Ό 미리 κΈ°λ‘ν΄λμλ€κ° νμ μμ μ¬μ©νλ©΄ λλ€!! μ¦, return λλ μλμ κ°μλ₯Ό DP λ°°μ΄μ μ μ₯νλ κ²μ΄λ€.
if (t <= 0) return 0;
dp[t][h][w] = Math.max(go(t-1, h^1, w-1), go(t-1, h, w)) + (tree[t] == h ? 1 : 0);
return dp[t][h][w];
μμ κ·Έλ¦Όμμλ t=1, w=1, h=1 λ¬Έμ κ° κ²ΉμΉλλ°, μ΄ λ λ¨Ήμ μ μλ μλ κ°μλ 1κ°κ° μ΅λμμ μ΄λ―Έ ꡬνμΌλ―λ‘ t=2, h=1, w=1μ ν΄λΉ κ²½μ°μ μλ₯Ό ꡬνμ§ μκ³ λ°λ‘ DPμ μ μ₯λ κ°μ μ΄μ©νλ©΄ λλ€.
if (t <= 0) return 0;
if (dp[t][h][w]μ κ°μ΄ μλ€λ©΄) return dp[t][h][w];
dp[t][h][w] = Math.max(go(t-1, h^1, w-1), go(t-1, h, w)) + (tree[t] == h ? 1 : 0);
return dp[t][h][w];
μ΄λ¬λ©΄ ν΄λΉ λ¬Έμ μ ν΅μ¬ λ‘μ§μ΄ λμλ€! μ΄μ λ§μ§λ§μΌλ‘ wμ λν΄μ μ²λ¦¬ν΄μ£ΌκΈ°λ§ νλ©΄ λλ€. wλ 0μΌ λκΉμ§λ μλλ₯Ό λ¨Ήμ μ μμΌλ―λ‘ 0λ³΄λ€ μμμ§ μκ°λΆν°λ μμ λΆκ°λ₯ν κ²½μ°μ΄λ€. μ¦, μλ κ°μμ μν₯μ μ€ μ μλ€. κ·Έλ¬λ―λ‘ 0μ returnνμ¬ μλ κ°μμ μν₯μ μ£Όμ§ μλλ‘ νλ€!
if (t <= 0 || w < 0) return 0;
if (dp[t][h][w]μ κ°μ΄ μλ€λ©΄) return dp[t][h][w];
dp[t][h][w] = Math.max(go(t-1, h^1, w-1), go(t-1, h, w)) + (tree[t] == h ? 1 : 0);
return dp[t][h][w];
μ½λ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
// μκ°μ ν 2μ΄, λ©λͺ¨λ¦¬μ ν 128MB
static int T, W;
static int[] tree;
static int[][][] dp;
static int go(int t, int h, int w) {
if (t <= 0 || w < 0) return 0;
if (dp[t][h][w] != -1) return dp[t][h][w];
dp[t][h][w] = Math.max(go(t-1, h^1, w-1), go(t-1, h, w)) + (tree[t]-1 == h ? 1 : 0);
return dp[t][h][w];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
T = Integer.parseInt(st.nextToken());
W = Integer.parseInt(st.nextToken());
tree = new int[T+1];
tree[0] = 0;
for (int i = 1; i <= T; i++) tree[i] = Integer.parseInt(br.readLine());
dp = new int[T+1][2][W+1];
// -1λ‘ μ΄κΈ°ν νμ§μμΌλ©΄ dp κ°λ€μ΄ 0μ΄ λλλ°,
// 0μΌλ‘ dp κ°μ΄ μ‘΄μ¬νλμ§ μ¬λΆλ₯Ό μ ν΄μ£Όλ©΄ μμ§ κ΅¬νμ§ μμ κ²½μ°μ μμ λν΄μ return dp[t][h][w];κ° μ€νλλ€.
for (int i = 0; i <= T; i++) {
for (int j = 0; j < 2; j++) Arrays.fill(dp[i][j], -1);
}
System.out.println(Math.max(go(T, 0, W), go(T, 1, W-1)));
}
}
'μκ³ λ¦¬μ¦ λ¬Έμ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
2293 - λμ 1 (0) | 2024.09.23 |
---|---|
2294λ² λ¬Έμ λ©λͺ¨ (0) | 2024.09.22 |
2098 - μΈνμ μν (2) | 2024.09.17 |
2565 - μ κΉμ€ (0) | 2024.09.12 |
1561 - λμ΄ κ³΅μ (2) | 2024.09.09 |