우선 행의 크기가 N, 열의 크기가 3인 배열을 만들어주자.
long [][] dp=new long[n+1][3];
열의 크기가 3인 이유는 N번째 우리에 사자가 들어가는 경우는 [N][0], 첫번째 우리에 들어가 있을 경우 [N][1], 두번째 우리에 들어가 있는 경우 [N][2] 로 해주기 위함이다.
점화식 만들기
i번째 행의 우리에 사자가 없는 경우 ==> i-1번째 우리에 사자가 없거나, 1번째 우리에 있거나, 2번째 우리에 있는 경우
dp[i][0]=(dp[i-1][1]+dp[i-1][2]+dp[i-1][0])%9901;
i번째 행의 1번째 우리에 사자가 있는 경우 ==> i-1번째 우리에 사자가 없거나, 2번째 우리에 있는 경우
dp[i][1]=(dp[i-1][0]+dp[i-1][2])%9901;
i번째 행의 2번째 우리에 사자가 있는 경우 ==> i-1번째 우리에 사자가 없거나, 1번째 우리에 있는 경우
dp[i][2]=(dp[i-1][0]+dp[i-1][1])%9901;
이와 같은 규칙으로 점화식을 만들 수 있다.
점화식을 바탕으로 만든 정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
long [][] dp=new long[n+1][3];
dp[1][0]=1;
dp[1][1]=1;
dp[1][2]=1;
for(int i=2; i<=n; i++) {
dp[i][0]=(dp[i-1][1]+dp[i-1][2]+dp[i-1][0])%9901;
dp[i][1]=(dp[i-1][0]+dp[i-1][2])%9901;
dp[i][2]=(dp[i-1][0]+dp[i-1][1])%9901;
}
long sum=0;
for(int i=0; i<3; i++) {
sum=(sum+dp[n][i])%9901;
}
System.out.println(sum);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준-2156번/포도주 시식 (java) (2) | 2024.02.28 |
---|---|
백준-11057번/오르막 수 (java) (0) | 2024.02.23 |
백준-1149번/RGB거리 (java) (0) | 2024.02.22 |
백준-2225번/합분해 (java) (1) | 2024.02.20 |
백준-1699번/제곱수의 합 (java) (0) | 2024.02.19 |