(백준 1562) 단계 수(Java) 정리

가면을 조금사용

(완전한 코드)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	static final int MOD = 1000000000;
	public static int goUpStair(int()()() dp, int idx, int N, int cur, int visited) {
		if(dp(idx)(cur)(visited) != 0) return dp(idx)(cur)(visited);
		
		if(idx == N) 
			if(visited == ((1 << 10) - 1)) return 1;
			else return 0;
		
		int count = 0;
		
		if(cur < 9) count += goUpStair(dp, idx + 1, N, cur + 1, visited | (1 << (cur + 1)));
		if(cur > 0) count += goUpStair(dp, idx + 1, N, cur - 1, visited | (1 << (cur - 1)));
	
		return dp(idx)(cur)(visited) = count %= MOD;
	}
	
    public static void main(String() args) {
        int N;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int count = 0;
        try
        {
            N = Integer.parseInt(br.readLine());
            int()()() dp = new int(N + 1)(10)((1 << 10));
            
            for(int i = 1; i < 10; i++) {
            	count += goUpStair(dp, 1, N, i, (1 << i));
            	count %= MOD;
            }
            
            bw.write(Integer.toString(count));
            
            bw.flush();
            bw.close();
            br.close();
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

int()()() dp = new int(N + 1)(10)((1 << 10));
// dp(남은 수의 길이)(현재 위치)(방문한 숫자)

dp 배열은 현재 위치에서 단계 수를 취할 수 있는 경우에만 1보다 큰 값을 갖습니다.

for(int i = 1; i < 10; i++) {
    count += goUpStair(dp, 1, N, i, (1 << i)); //1부터 9까지의 수로 시작하는 경우를 모두 더함
    count %= MOD;
}

단계 수는 0을 제외한 1에서 9 사이의 숫자로 시작할 수 있습니다.

$N = 10$이면 1XXXXXXXXX에서 9XXXXXXXXX까지의 값이 나올 수 있습니다.

if(dp(idx)(cur)(visited) != 0) return dp(idx)(cur)(visited);
//dp의 값이 이미 나왔으면 굳이 다시 계산하지 않고 바로 return

이 코드를 넣지 않으면 계산하는 데 시간이 오래 걸립니다.

if(idx == N) 
    if(visited == ((1 << 10) - 1)) return 1; //모든 수 0~9를 방문했으면 1 return
    else return 0; //아닌 경우 0 return

if(cur < 9) count += goUpStair(dp, idx + 1, N, cur + 1, visited | (1 << (cur + 1)));
if(cur > 0) count += goUpStair(dp, idx + 1, N, cur - 1, visited | (1 << (cur - 1)));
//cur == 9면 다음 수는 8이어야만 한다.
//cur == 0이면 다음 수는 1이어야만 한다.

함수를 실행하고 값을 반환할 때마다 모드를 통해 공유해도 상관없습니다.