티스토리 뷰
- 11726
DP 문제는 n에 따라 작은 수부터 직접 대입해보고 점화식을 세우는게 푸는 방법인 것 같다.
n이 0 또는 1이라면 1개의 경우의 수가 생기며
n이 2면 1*2 2*1 의 타일이 두개씩 들어가는 경우의 수가 있으므로 그 수는 2가 된다.
n이 3인 경우 추가로 오른쪽에 타일이 붙는다고하면
n=1인 경우에서 2*1인 타일이 가로로 두개가 오른쪽에 붙을 수 있다.
n=2인 경우에서는 1*2인 타일이 세로로 하나가 오른쪽에 붙을 수 있다.
따라서 n=1 인 경우의 수와 n=2 인 경우의 수를 더하면 된다.
Bottomup 방식
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
int d[] = new int[n+1];
d[0] = d[1] = 1;
for(int i = 2; i <= n; i++) {
d[i] = d[i-1] + d[i-2];
d[i] %= 10007;
}
System.out.println(d[n]);
}
}
Topdown 방식
public class Main {
static int d[];
static int topDown(int n) {
if(n == 0 || n == 1) return 1;
if(d[n] > 0) return d[n];
d[n] = topDown(n-1) + topDown(n-2);
d[n] %= 10007;
return d[n];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
d = new int[n+1];
System.out.println(topDown(n));
}
}
- 11727
위 문제에서 2*2타일이 추가되어서 1*2, 2*1, 2*2 세개 타일로 문제는 푼다.
n인 경우
n-2 인 경우에 2*1과 2*2 타일이 오른쪽에 붙는 것을 생각하고
n-1 인 경우에 1*2의 타일이 오른쪽에 붙는 것을 생각하면 된다.
Topdown 방식
public class Main {
static int d[];
static int topDown(int n) {
if(n == 0 || n == 1) return 1;
if(d[n] > 0) return d[n];
d[n] = topDown(n-1) + 2*topDown(n-2);
d[n] %= 10007;
return d[n];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
d = new int[n+1];
System.out.println(topDown(n));
}
}
- 9095
타일링 문제를 먼저 접하고 본 문제를 보아서 그런지 점화식으로 풀 생각으로 접근했다.
n인 경우를 볼때
n-3 의 경우에는 오른쪽에 3을 더한다고 생각하고
n-2 의 경우에는 오른쪽에 2를 더한다고 생각하고
n-1 의 경우에는 오른쪽에 1을 더한다고 생각한다
그래서 n-3, n-2, n-1 의 경우를 모두 더한 것이 n의 경우의 수가 된다.
public class Main {
static int d[];
static int topDown(int n) {
if(n == 0 || n == 1) return 1;
if(n == 2) return 2;
if(n == 3) return 4;
if(d[n] > 0) return d[n];
d[n] = topDown(n-1) + topDown(n-2) + topDown(n-3);
return d[n];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
d = new int[11];
for(int i = 0; i < n; i++) {
int a = sc.nextInt();
System.out.println(topDown(a));
}
sc.close();
}
}
'algorithm' 카테고리의 다른 글
[DP] 9465, 2156 (0) | 2020.04.22 |
---|---|
[DP] 11057 (0) | 2020.04.20 |
[DP] 1463번 (0) | 2020.04.14 |
[입출력] 별찍기 10992, 10991, 2446 (0) | 2020.04.12 |
[입출력] 1924, 8393, 10818, 2438 (0) | 2020.04.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 알고리즘
- 동적프로그래밍
- 입출력장치
- 인접행렬
- 세마포어
- Stack
- 스텍
- 자료구조
- C++
- 퀵정렬
- 이진탐색
- 재귀함수
- Java
- C
- react
- 병행프로세스
- 최단경로
- 교착상태
- 클래스
- 구조체
- 인접리스트
- server side rendering
- client side rendering
- 운영체제
- dfs
- stackframe
- 소프트웨어
- javascript
- 배열
- BFS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함