π λ¬Έμ
π μμ΄λμ΄
μ²μ λ¬Έμ λ₯Ό λ΄€μ λλ κ·Έλ₯ dfsλ₯Ό μ΄μ©νλ νμ΄λ₯Ό μκ°νλ€ -> κ·Έλμ 3λ² μκ° μ΄κ³Ό λ¬λ€ (dfsμμλ μ΅μ ν κ°λ₯ν μ€ μκ³ μ¬λ¬ λ² λμ νλ€.)
3λ²μ΄λ μκ°μ΄κ³Ό νμλ dpλ₯Ό λ μ¬λ Έλ€. μκ°ν΄λ³΄λκΉ κ°λ₯νλ€λ μκ°μ΄ λ€μλ€.
κ·Έλμ dpλ‘ μμ νκ³ μ μΆνλκΉ 16%μμ νλ Έμ΅λλ€ λΌλ λ©μμ§κ° λμμ λΉν©νλ€.
λμ§.. μ€λ§ νμ λ¬Έμ μΈκ° λΌλ μκ°μΌλ‘ μ£μ§ μΌμ΄μ€λ₯Ό λ£μΌλκΉ μμλ‘ λμμ μ€λ²νλ‘μ°λ°μμ νμΈνλ€ μ΄νμ longμΌλ‘ μ μΈνμ¬ λ€μ μ μΆνλκΉ ν΅κ³Όνλ€.
λ¬Έμ μ체λ λ¨μ dfsλ‘ μ κ·Όνλ©΄ κ°λ¨νλ€.
κ·Έ μ μ μ«μλ₯Ό μ μ₯νκ³ ν΄λΉ μ«μλ³΄λ€ 2λ°°ν° μ«μλ§ κ°λ₯νλλ‘ dfsλ₯Ό νλ©΄ λλ€.
private static void dfsCnt(int nowDepth, int start) {
if (nowDepth == n) {
cnt++;
} else {
for (int i = start; i <= m; i++) {
dfsCnt(nowDepth + 1, i * 2); //μ΄μ μ«μλ³΄λ€ 2λ°° 컀μΌνλ€.
}
}
}
κ·Όλ° μ΄λ κ² νλ©΄ μκ°μ΄κ³Όκ° λλ€.
μκ°ν΄λ³΄λ startμμ mκΉμ§μ λ²μκΉμ§λ₯Ό λ°λ³΅νλ κ²λ³΄λ€ λ§μ½ mμ΄ 10μ΄λΌλ©΄
4 : 10
3 : 10/2
2 : 10/2/2
1 : 10/2/2/2
μ λ²μλ΄μ μ«μμ¬μΌλ§ nλ²κΉμ§μ μ«μκ° λ‘λλ‘ λ½ν μ μλ€λ μκ°μ΄ λ€μλ€.
private static void dfsCnt(int nowDepth, int start) {
if (nowDepth == n) {
cnt++;
} else {
for (int i = start; i <= m / Math.pow(2, n - nowDepth - 1); i++) {
dfsCnt(nowDepth + 1, i * 2);
}
}
}
κ·Όλ° μ΄λ κ² ν΄λ μκ° μ΄κ³Όκ° λ°μνλ€.
κ·Έλμ λ§μ§λ§ νμ΄μΈ dpλ₯Ό μ¬μ©νμλ€. μ λ΅
dpμμλ iλ νμ¬κΉμ§ λ½μ μ«μ, jλ ν΄λΉ λ²μ : μ¦ dp [i][j]λ jκΉμ§μ μ«μ μ€ iκ°λ₯Ό λ½μ μ μλ κ²½μ°μ μλ₯Ό μ μ₯νκ³ μλ€.
jλ₯Ό Math.pow(2,i-1)λ‘ μ§μ ν μ΄μ λ μ«μμ μμμ΄ 1λΆν° μ΄κΈ° λλ¬Έμ μ μ΄λ 1/2/4/8/16μ μ«μλ‘ μ¦κ°ν΄ λκ°μ ν΄λΉ λ²μλ₯Ό μ§μ νλ€. (μκ°ν΄ 보λκΉ endλ²μλ μ§μ ν μ μμ§ μμκΉ)
END λ²μλ₯Ό μ§μ νλ κ²½μ°
λ΅μ λ§λλ° μκ°μ΄ λ κ±Έλ¦°λ€. pow κ³μ° λλ¬ΈμΈκ° (λΉνΈλ§μ€νΉμ μ΄μ©νλ©΄ λ 짧μμ§λ..)
Arrays.fill(dp[1], 1);
dp[1][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = (int) Math.pow(2, i - 1); j <= m / Math.pow(2, n - i); j++) {
dp[i][j] += dp[i - 1][j / 2]; //νμ¬κ° /2λ³΄λ€ μμ λͺ¨λ κ²½μ° iκ° λμ¬ μ μμ
dp[i][j] += dp[i][j - 1];
//λμ ν© νμμ μ΄μ©νκΈ°μν΄μ λνλ€. μ΄μ μ«μκΉμ§μ κ°λ₯ν κ²½μ°μ μλ₯Ό λνλ€(λ μμ κ²½μ°λ κ°λ₯νκΈ° λλ¬Έμ)
}
}
dp[i][j]λ i-1κ°μ μ«μλ₯Ό j/2κ°μ λ²μ μμμ λ½μ κ²½μ°μ λ€μ μ«μλ‘ jλ₯Ό λ½μ μ μμ΄μ λνλ€.
κ·Έλ¦¬κ³ dp[i][j]λ dp[i][j-1]κΉμ§ λ½μ κ²½μ°λ λ£μ μ μμμΌλ‘ λμ ν© λ°©μμ μ΄μ©νκΈ° μνμ¬ λνμλ€.
Arrays.fill(dp[1], 1);
dp[1][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = (int) Math.pow(2, i - 1); j <= m; j++) {
dp[i][j] += dp[i - 1][j / 2]; //νμ¬κ° /2λ³΄λ€ μμ λͺ¨λ κ²½μ° iκ° λμ¬ μ μμ
dp[i][j] += dp[i][j - 1];
//λμ ν© νμμ μ΄μ©νκΈ°μν΄μ λνλ€. μ΄μ μ«μκΉμ§μ κ°λ₯ν κ²½μ°μ μλ₯Ό λνλ€(λ μμ κ²½μ°λ κ°λ₯νκΈ° λλ¬Έμ)
}
}
π νμ΄
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
//μ μμ΄κ° ꡬ맀νλ λ‘λμ κ°μλ₯Ό ꡬνμ¬λΌ
//μ΄μ μ«μλ³΄λ€ λλ°°μ΄μ 컀μΌνλ€.
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
long[][] dp = new long[n + 1][m + 1]; //μ«μ mκΉμ§ nκ°μ μ«μλ₯Ό λ½λ κ²½μ°μ μ
Arrays.fill(dp[1], 1);
dp[1][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = (int) Math.pow(2, i - 1); j <= m; j++) {
dp[i][j] += dp[i - 1][j / 2]; //νμ¬κ° /2λ³΄λ€ μμ λͺ¨λ κ²½μ° iκ° λμ¬ μ μμ
dp[i][j] += dp[i][j - 1];
//λμ ν© νμμ μ΄μ©νκΈ°μν΄μ λνλ€. μ΄μ μ«μκΉμ§μ κ°λ₯ν κ²½μ°μ μλ₯Ό λνλ€(λ μμ κ²½μ°λ κ°λ₯νκΈ° λλ¬Έμ)
}
}
sb.append(dp[n][m]).append("\n");
}
System.out.println(sb);
}
}
'λ°±μ€(boj)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JAVA]1063 νΉ, ꡬν, μ€λ²3 (0) | 2023.05.31 |
---|---|
[JAVA]17143 λμμ (1) | 2023.05.29 |
[λ°±μ€ Java] 4963 μ¬μ κ°μ (0) | 2023.05.26 |
[JAVA]1092 λ°° ( μ΄λΆ νμ ) (0) | 2023.05.23 |
[JAVA]22862 κ°μ₯ κΈ΄ μ§μ μ°μν λΆλΆμμ΄ (0) | 2023.05.18 |