白駿11057上り坂樹-node.js
このポスターは白準11057号の上り坂の木を描いています.質問リンク
コードはjavascriptで書かれています.
上り坂数とは、数字の位置が昇順に並ぶ数です.このとき、隣接する数が同じでも昇順に打つ.
[例] 2234と367811119は上り坂数です. 2232,3676,9111は上り坂数ではありません.
数の長さがNの場合、上り坂数を求めるプログラムを作成します.
数はゼロから始まることができます.
第1行はN(1≦N≦1000)を与える.
出力1行目の長さNの上り坂数を10007の残りの部分で割った.
3ビット数
詳細な論理は、例によって説明されます.
N=3の場合、可能な上り坂数を求める.
前述したように、各ビット数は、前の数字のSTATEに基づいて入力可能な数字を決定する.
したがって,n=1から部分和を求める.
0から9まで10種類のケースがあり、1桁であるためです. 0から9の場合はそれぞれ1つの場合を占めている. DP中N=1の場合は、DP[0]として保存される.
DP[0] = [1,1,1,1,1,1,1,1,1,1]
10の桁数は一日の桁数の値によって決まる.
0+0~9(10種)
1+1-9(9種)
2+2~9(8種類)
...
8+8~9(2種類)
9+9(1種)
DPでは、N=2の場合をDP[1]として保存する.
DP[1] = [10,9,8,7,6,5,4,3,2,1]
白の桁数は、前の桁数の値に基づいて入ることができる桁数を決定します.
0+00~99(55種)
1+11~99(45種)
2+22~99(36種類)
...
8+88~99(3種類)
9+99(1種)
このケースを表示すると、
理由は.
DP[2][0] = 0 + 00~99//55
DP[2][1] = 0 + 11~99//45
DP[1][0] = 0 + 0~9//10
はい、DP[2][1]は、前の数が00~09のエンクロージャ、すなわちDP[1][0]を含まないためです!
DPでは、N=3の場合をDP[2]として保存する.
DP[2] = [55,45,36,28,21,15,10,6,3,1]
てんかしき
DP[i][j] = DP[i][j+1] + DP[i-1][j]
コードはjavascriptで書かれています.
質問する
1.問題の説明
上り坂数とは、数字の位置が昇順に並ぶ数です.このとき、隣接する数が同じでも昇順に打つ.
[例]
数の長さがNの場合、上り坂数を求めるプログラムを作成します.
数はゼロから始まることができます.
入力
第1行はN(1≦N≦1000)を与える.
しゅつりょく
出力1行目の長さNの上り坂数を10007の残りの部分で割った.
に答える
1.ロジック
3ビット数
___
の場合、各ビット数は、前のビット数のSTATEに従って決定され得る.したがって、この問題はDP
によって解決することができる.詳細な論理は、例によって説明されます.
2.ロジック
N=3の場合、可能な上り坂数を求める.
前述したように、各ビット数は、前の数字のSTATEに基づいて入力可能な数字を決定する.
したがって,n=1から部分和を求める.
[N =1]
10ケースDP[0] = [1,1,1,1,1,1,1,1,1,1]
[N =2]
の55種類の場合10の桁数は一日の桁数の値によって決まる.
0+0~9(10種)
1+1-9(9種)
2+2~9(8種類)
...
8+8~9(2種類)
9+9(1種)
DPでは、N=2の場合をDP[1]として保存する.
DP[1] = [10,9,8,7,6,5,4,3,2,1]
[N =3]
220の場合白の桁数は、前の桁数の値に基づいて入ることができる桁数を決定します.
0+00~99(55種)
1+11~99(45種)
2+22~99(36種類)
...
8+88~99(3種類)
9+99(1種)
N = 3
の場合、DP[2]=[55,45,36,28,21,15,10,6,3,1]となる.N = 2
の場合、DP[1]=[10,9,8,7,6,5,4,3,2,1].このケースを表示すると、
DP[2][0] = DP[2][1] + DP[1][0]
と判断できます.理由は.
DP[2][0] = 0 + 00~99//55
DP[2][1] = 0 + 11~99//45
DP[1][0] = 0 + 0~9//10
はい、DP[2][1]は、前の数が00~09のエンクロージャ、すなわちDP[1][0]を含まないためです!
DPでは、N=3の場合をDP[2]として保存する.
DP[2] = [55,45,36,28,21,15,10,6,3,1]
3.点火式
てんかしき
DP[i][j] = DP[i][j+1] + DP[i-1][j]
完全なコード
const input = require('fs').readFileSync('/dev/stdin').toString();
const N = Number(input);
const DP = new Array(N+1);
for (let i = 0; i < DP.length; i++) {
DP[i] = new Array(10).fill(1);
}
for (let i = 1; i <= N; i++) {
for (let j = 8; j >= 0; j--) {
DP[i][j] = (DP[i][j+1] + DP[i-1][j]) % 10007;
}
}
console.log(DP[N][0]);
Reference
この問題について(白駿11057上り坂樹-node.js), 我々は、より多くの情報をここで見つけました https://velog.io/@dev-redo/백준-11057-오르막-수-node.jsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol