https://www.acmicpc.net/problem/1904
1904번: 01타일
지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이의 공부를 방해하기 위해 0이 쓰여진 낱장의 타일들을 붙여서 한 쌍으로 이루어진 00 타일들을 만들었다. 결국 현재 1 하나만으로 이루어진 타일 또는 0타일을 두 개 붙인 한 쌍의 00타일들만이 남게 되었다. 그러므로 지원이는 타일로 더 이상 크기가 N인 모든 2진 수
www.acmicpc.net
연구실 프로젝트마감이 있어서 알고리즘 문제풀이에 투자할 시간이 없어서 오랜만에 게시글을 올린다.
전형적인 동적계획법 문제였는데 동적계획법 문제를 안푼지 오래되서 그런게 기억이 잘나지않았다. 백트래킹으로 문제를 풀었는데 메모리 초과 오류가 발생했다.
배운점
동적계획법은 무조건 전의 결과값이 현재의 결과값에 영향을 미친다 즉 1~n 까지 경우를 손으로 직접해보면서 규칙을 찾는 것도 도움이된다. 이 문제의 경우 알고나면 피보나치 수열과 크게 다를 바가 없는 문제이다.
0의 경우는 입력조건이 자연수라 처리하지 않아도 문제가 발생하지 않았지만 1이 입력되는 경우 dp[2]가 생성되지 않기 때문에 조건문을 추가하였다.
풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package 동적계획법;
import java.io.*;
public class P01타일 {
//점화식 한칸씩전진할떄 어떤값이 나오는지 알고 규칙을 찾아야함
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
long[] dp = new long[n+1];
dp[1] = 1;
if(n>1)
dp[2] = 2;
for(int i=3;i<=n;i++){
dp[i] = dp[i-2]+dp[i-1];
dp[i]%=15746;
}
System.out.println(dp[n]);
}
}
|
cs |
'IT > 알고리즘' 카테고리의 다른 글
백준 1697 숨바꼭질 자바 (0) | 2020.04.26 |
---|---|
백준 9461 파도반 수열 자바 (0) | 2020.04.26 |
백준 1238 파티 (0) | 2020.04.07 |
백준7576 토마토 (자바) (0) | 2020.03.27 |
백준 1012 유기농배추 (0) | 2020.03.23 |