algorithm

[DP] 11057

tonirr 2020. 4. 20. 06:06

  • 계단 수나 이번 문제나 표에 정리하여 접근해야 겠다. 메모장에 기록하니 이중배열의 문제의 경우 전 행의 숫자들을 활용하가 어려운 것 같다.
  • Memo
    • 문제 정의
      • 이중배열을 사용하여 접근한다.
      • 계단 수는 맨앞의 숫자를 기준으로 규칙을 세우는 것이고 이번 문제는 맨 뒤의 숫자를 기준으로 규칙을 세운다. 
      • 최종으로 구해야 할 값은 n행의 모든 값을 더한 값이다.
        • n-1, n-2, ... 행의 오르막 수는 이미 n행에 포함되어있다.
    • 방법
      • 먼저 1행의 모든 값을 1로 초기화 시킨다.
      • n행의 각각의 열을 구할 때에는
        • 행을 구하는 i를 n까지 돌리는 for문
        • 열의 마지막 값까지 구하는 j를 9까지 돌리는 for문
        • i행 j열에 해당하는 값을 구하는 k가 j까지 돌아가는 for문을 정의
          • 이러한 for문 안에서 dp[i][j] 의 값을 각각 구하고 n행의 모든 값을 더해주면 된다.
public class Main {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);     
		int n = sc.nextInt();
		sc.close();
		
		long dp[][] = new long[n+1][10];
		int result = 0;
		
		for(int i = 0; i < 10; i++) {
			dp[1][i] = 1;
		}
		
		for(int i = 2; i <= n; i++) {
			for(int j = 0; j < 10; j++) {
				for(int k = 0; k <= j; k++) {
					dp[i][j] += dp[i-1][k];
				}
				
				dp[i][j] %= 10007;
			}
		}
		
		for(int i = 0; i < 10; i++) {
			result += dp[n][i];
		}
		
		System.out.println(result % 10007);
	}
}