200919土[BOJ]10844


BOJ 10844

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {	
    public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	int N = Integer.parseInt(br.readLine());
    	br.close();
    	
    	long f[][] = new long[N+1][10];
    	
    	for(int i=1;i<=9;i++) {
    		f[1][i] = 1;
    	}
    	
    	for(int i=2;i<=N;i++) {
    		for(int j=0;j<10;j++) {
    			if(j==0) {
    				f[i][j] = f[i-1][j+1] % 1000000000;
    			} else if (j==9) {
    				f[i][j] = f[i-1][j-1] % 1000000000;
    			} else {
    				f[i][j] = (f[i-1][j-1] + f[i-1][j+1]) % 1000000000;
    			}
    		}
    	}
    	long sum = 0;
    	for(int i=0;i<10;i++) {
    		sum += f[N][i];
    	}
    	System.out.println(sum%1000000000);
    	
    }
}
これは二重配列を利用したDP問題である.
ルールを見つけ、DPで解決する方法を見つけます.
このような問題であれば、각 자리가 1씩 차이나는 계단수의 특성も利用できます💡 끝자리を基準としてデュアルアレイを作成する考え方💡これは重要です.
一人では感じられないので、他の人の解答を参考にして、コードしていましたが、ずっと間違いがあって、結果が出てきたので、これはなぜかと思って、最後のsum % 1000000000はくれませんでした.
白準問題では,なぜ常に数値に割り当てられた残りの部分を印刷させるのか,まだ疑問がある.資料型の範囲を超えているわけではないし...