Open robert-min opened 1 year ago
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
import sys
input = sys.stdin.readline
dp = [0] * (11)
dp[1] = 1 dp[2] = 2 dp[3] = 4
for i in range(4, 11): dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
T = int(input()) for _ in range(T): N = int(input()) print(dp[N])
- 완전 탐색 풀이(DFS)
```python
import sys
input = sys.stdin.readline
def dfs(n):
global count
if n == N:
count += 1
return
if n > N:
return
dfs(n + 1)
dfs(n + 2)
dfs(n + 3)
T = int(input())
for _ in range(T):
N = int(input())
count = 0
dfs(0)
print(count)
import java.io.*;
import java.util.*;
public class Main {
static FastReader scan = new FastReader();
static StringBuilder sb = new StringBuilder();
static int[] Dy;
static void preprocess(){
Dy = new int[15];
// 초기값 구하기
Dy[1] = 1;
Dy[2] = 2;
Dy[3] = 4;
// 점화식을 토대로 Dy 배열 채우기
for (int i = 4; i <= 11; i++){
Dy[i] = Dy[i - 1] + Dy[i - 2] + Dy[i - 3];
}
}
static void pro() {
int T = scan.nextInt();
for (int tt = 1; tt <= T; tt++){
int N = scan.nextInt();
sb.append(Dy[N]).append('\n');
}
System.out.print(sb);
}
public static void main(String[] args) {
preprocess();
pro();
}
}
import sys
input = sys.stdin.readline
dp = [0] * 1001
dp[1] = 1
dp[2] = 2
for i in range(3, 1001):
dp[i] = (dp[i-1] + dp[i-2]) % 10007
N = int(input())
print(dp[N])
import java.io.*;
import java.util.*;
public class Main {
static FastReader scan = new FastReader();
static StringBuilder sb = new StringBuilder();
static int N;
static int[] Dy;
static void input(){
N = scan.nextInt();
}
static void pro() {
Dy = new int[1005];
// 초기값 구하기
Dy[1] = 1;
Dy[2] = 2;
// 점화식을 토대로 Dy 배열 채우기
for (int i = 3; i <= N; i++){
Dy[i] = (Dy[i - 1] + Dy[i - 2]) % 10007;
}
System.out.println(Dy[N]);
}
public static void main(String[] args) {
input();
pro();
}
}
Dy[i-1][0] + A[i]
만 확인import sys
input = sys.stdin.readline
N = int(input())
from collections import defaultdict
A = defaultdict(int)
for i in range(N):
A[i] = int(input())
dp = [[0, 0] for _ in range(N+2)]
# init
dp[0][0], dp[0][1] = 0, A[0]
if N >= 2:
dp[1][0], dp[1][1] = A[1], A[0] + A[1]
for i in range(2, N):
dp[i][0] = max(dp[i-2][0] + A[i], dp[i-2][1] + A[i])
dp[i][1] = dp[i-1][0] + A[i]
print(max(dp[N-1][0], dp[N-1][1]))
import java.io.*;
import java.util.*;
import java.lang.Math;
public class Main {
static FastReader scan = new FastReader();
static StringBuilder sb = new StringBuilder();
static int N;
static int[][] Dy;
static int[] A;
static void input(){
N = scan.nextInt();
A = new int[N + 1];
Dy = new int[N + 1][2];
for (int i = 1; i <= N; i++){
A[i] = scan.nextInt();
}
}
static void pro() {
// 초기값 구하기
Dy[1][0] = 0;
Dy[1][1] = A[1];
if (N >= 2){
Dy[2][0] = A[2];
Dy[2][1] = A[1] + A[2];
}
// 점화식을 토대로 Dy 배열 채우기
for (int i = 3; i <= N; i++){
Dy[i][0] = Math.max(Dy[i - 2][0] + A[i], Dy[i - 2][1] + A[i]);
Dy[i][1] = Dy[i - 1][0] + A[i];
}
System.out.println(Math.max(Dy[N][0], Dy[N][1]));
}
public static void main(String[] args) {
input();
pro();
}
}
dp[j][i] = dp[j][i-1] - dp[j-1][i-1]
점화식 확인import sys
input = sys.stdin.readline
N = int(input())
# 1
dp = [[1] * (10) for _ in range(N+1)]
# 2
# # dp[N][0] = sum(dp[N-1])
# dp[1][0] = sum(dp[0])
# # 3
# for i in range(1, 10):
# dp[1][i] = dp[1][i-1] - dp[0][i-1]
for j in range(1, N+1):
dp[j][0] = sum(dp[j-1])
for i in range(1, 10):
dp[j][i] = dp[j][i-1] - dp[j-1][i-1]
print(sum(dp[N-1]) % 10007)
import java.io.*;
import java.util.*;
import java.lang.Math;
public class Main {
static FastReader scan = new FastReader();
static StringBuilder sb = new StringBuilder();
static int N;
static int[][] Dy;
static int[] A;
static void input() {
N = scan.nextInt();
A = new int[N + 1];
Dy = new int[N + 1][10];
}
static void pro() {
// 초기값 구하기
for (int num = 0; num <= 9; num++) {
Dy[1][num] = 1;
}
// 점화식을 토대로 Dy 배열 채우기
for (int len = 2; len <= N; len++) {
for (int num = 0; num <= 9; num++) {
// 길이가 len이고 num으로 끝나는 개수를 계산하자 == Dy[len][num] 을 계산하자.
for (int prev = 0; prev <= num; prev++) {
Dy[len][num] += Dy[len - 1][prev];
Dy[len][num] %= 10007;
}
}
}
// Dy배열로 정답 계산하기
int ans = 0;
for (int num = 0; num <= 9; num++) {
ans += Dy[N][num];
ans %= 10007;
}
System.out.println(ans);
}
public static void main(String[] args) {
input();
pro();
}
}
setrecursionlimit
설정이 필요import sys
sys.setrecursionlimit(100005)
input = sys.stdin.readline
from collections import defaultdict
N, R, Q = map(int, input().split())
graph = defaultdict(list)
for _ in range(N-1):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
dp = [0] * (N+1)
def dfs(now, prev):
global dp
dp[now] = 1
for nx in graph[now]:
if nx == prev: continue
dfs(nx, now)
dp[now] += dp[nx]
dfs(R, -1)
for _ in range(Q):
print(dp[int(input())])
import sys
input = sys.stdin.readline
from collections import defaultdict N, R, Q = map(int, input().split())
graph = defaultdict(list) for _ in range(N-1): u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
from collections import deque
visited = [False] * (N+1) tree = [[] for _ in range(N+1)] def dfs(): Q = deque() Q.append(R) visited[R] = True
while Q:
now = Q.pop()
for nx in graph[now]:
if not visited[nx]:
visited[nx] = True
tree[now].append(nx)
Q.append(nx)
dfs()
def bfs(start): global count Q = deque() Q.append(start)
while Q:
now = Q.popleft()
for nx in tree[now]:
count += 1
Q.append(nx)
return count
for _ in range(Q): count = 1 query = int(input()) print(bfs(query))
import sys
sys.setrecursionlimit(100005)
input = sys.stdin.readline
from collections import defaultdict
N = int(input())
town = [0] + list(map(int, input().split()))
graph = defaultdict(list)
for _ in range(N-1):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
# dp[i][0] 현재마을X, dp[i][1] 현재마을O
dp = [[0, 0] for _ in range(N+1)]
# 시작마을 1로 가정
def dfs(now, par):
dp[now][1] = town[now]
for nx in graph[now]:
if nx == par: continue
dfs(nx, now)
dp[now][0] += max(dp[nx])
dp[now][1] += dp[nx][0]
dfs(1, -1)
print(max(dp[1]))
def solution(N, number):
if number == 1:
return 1
set_list = []
for cnt in range(1, 9): # 1개부터 8개까지 확인
partial_set = set()
partial_set.add(int(str(N) * cnt)) # 이어 붙여서 만드는 경우 넣기
for i in range(cnt - 1): # (1, n-1) 부터 (n-1, 1)까지 사칙연산
for op1 in set_list[i]:
for op2 in set_list[-i - 1]:
partial_set.add(op1 + op2)
partial_set.add(op1 * op2)
partial_set.add(op1 - op2)
if op2 != 0:
partial_set.add(op1 / op2)
# 만든 집합에 number가 처음 나오는지 확인
if number in partial_set:
return cnt
set_list.append(partial_set)
return -1
풀이 방법 고민