전형적인 DP문제이다
일단 점화식은
dp [i] = dp[i-1]+dp[i-2]+dp[i-3] 인데 이걸 어떻게 도출하는지에 대해서 설명하겠다
모든 수를 1 , 2, 3 을 이용해서 만들어야 한다.
dp[i] 는 i번째 수를 만들 수 있는 개수로 하겠다
dp [1] = 1 총 1개
dp[2] = 1+1 / 2 총 2개
dp[3] = 1+1+1 , 1+2, 2+1, 3 총 4개
이제 dp[4]이상을 구해보자
dp[4]는 위 문제에도 나와있다.
(1+1+1+1) (1+2+1) (2+1+1) (3+1) (1+1+2) (2+2) (1+3)
자 이제 규칙을 찾기 위해 색을 칠하겠다.
(1+1+1+1) (1+2+1) (2+1+1) (3+1) (1+1+2) (2+2) (1+3)
색칠된 부분을 보자.
초록색으로 색칠된 것들은 dp[3]을 만드는것에 1을 더해준 것이고
파란색으로 색칠된 것들은 dp[2]을 만드는 것에 2를 더해준 것
빨간색으로 색칠된 것들은 dp[1]을 만드는 것에 3을 더해준 것이다.
n이 4일 경우
dp[3]을 만드는 경우의 수에 1을 더해주는것, dp[2]을 만드는 경우의수에 2를 추가하는것 dp[1]을 만드는 경우의수에 3을 더해주는 것이다.
즉 dp[n] = dp[n-1]+dp[n-2]+dp[n-3]이다.
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
|
public class Main {
static int n;
static int t;
static int dp[];
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
t = Integer.parseInt(br.readLine());
dp = new int[12];
dp[1]=1; // 1+1
dp[2]=2; //1+1 2
dp[3]=4; // 1+1+1 2+1 1+2 3
for(int i=4; i<=11; i++) {
dp[i] = dp[i-1]+dp[i-2]+dp[i-3];
}
while(t-->0) {
n = Integer.parseInt(br.readLine());
}
System.out.println(sb);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
cs |
'알고리즘' 카테고리의 다른 글
[백준 15988] 1,2,3 더하기 3 -JAVA// le_effort// (0) | 2020.03.09 |
---|---|
[백준 12101] 1,2,3 더하기2 -JAVA// le_effort// (0) | 2020.03.09 |
[백준 10942] 펠린드롬? -JAVA // le_effort// (0) | 2020.03.09 |
[백준 15558] 점프게임 -JAVA //le_effort// (0) | 2020.03.05 |
[백준 1890] 점프 -JAVA // le_effort// (0) | 2020.03.05 |