[白準/DP]11057号上り坂数(JAVA)
11219 ワード
質問する
に答える
dp[i][j]
:i
桁の最後の数字がj
の場合の上り坂の数i-1
の長さの上り坂数の最後にj
の数字を加えてdp[i][j]
の配列を満たす.このとき、countAddable()
は、upperBound
以下の数字を最後の数字とするi-1
の長さの上り坂数を求める.最終結果は
dp[n][0]
からdp[n][9]
の合計が正解です.コード#コード#
import java.io.*;
public class Main {
private static final int MAXIMUM = 1000;
private static final int MOD = 10007;
private static final int NUMBERS = 10;
private static int n;
private static int[][] dp = new int[MAXIMUM + 1][NUMBERS];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine());
dp();
bw.append(String.valueOf(sum(dp[n])));
br.close();
bw.close();
}
private static void dp() {
for (int i = 0; i < NUMBERS; i++) dp[1][i] = 1;
for (int i = 2; i <= n; i++)
for (int j = 0; j < NUMBERS; j++)
dp[i][j] = countAddable(dp[i - 1], j) % MOD;
}
private static int countAddable(int[] arr, int upperBound) {
int count = 0;
for (int i = 0; i <= upperBound; i++) count = (count + arr[i]) % MOD;
return count;
}
private static int sum(int[] arr) {
int sum = 0;
for (int val : arr) sum = (sum + val) % MOD;
return sum;
}
}
Reference
この問題について([白準/DP]11057号上り坂数(JAVA)), 我々は、より多くの情報をここで見つけました https://velog.io/@jwkim/dp-11057テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol