문제 URL : https://www.acmicpc.net/problem/2688
2688번: 줄어들지 않아
첫째 줄에 테스트 케이스의 개수 T(1 <= T <= 1,000)이 주어진다. 각 테스트 케이스는 숫자 하나 n으로 이루어져 있다. (1 <= n <= 64)
www.acmicpc.net
문제 접근법 :
직접 숫자를 만들어보시면 알수있습니다.
길이가 1인 수 : 0 ,1,2,3,4,5,6,7,8,9 이것들은 ->각각 1개씩
길이가 2인수 :
00,01,~~~,09, :10개
11,12, 13, ~~19, :9개
~~ .
88,89, :2개
99 : 1개
길이가 3인수
000~ 099,
111~199
222~299
~
888~899
999를
직접 코드로 만들어보면 그갯수를 구하는거니 그규칙이있습니다.
첫자리가 0로 시작하면 그뒤에는 0123456789가 전부 들어갈수있습니다.
첫자리가 1로 시작하면 그뒤에는 1~9까지 전부 들어갈수있습니다.
이것을 반복적으로하면
...
첫자리가 8로 시작하면 그뒤에는 8~9까지 전부 들어갈수있고
첫자리가 9로 시작하면 그뒤에는 9만 들어갈수 있습니다.
이러한 규칙성으로인해 점화식은 쉽게나옵니다.
점화식 : 길이가 n일때 t로 시작하면 길이가 n-1 t~9까지의 경우의수를 전부 더해주면 되는겁니다.
소스코드 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include<bits/stdc++.h>
using namespace std;
long long dp[65][10];
int n;
void init() {
for (int i = 0; i < 10; i++)dp[1][i] = 1;
for (int len = 2; len <= 64; len++) {
for (int i = 0; i < 10; i++) {
for (int j = i; j < 10; j++) {
dp[len][i] += dp[len - 1][j];
}
}
}
}
void input() {
cin >> n;
}
void solve(){
long long res = 0;
for (int i = 0; i < 10; i++)
res += dp[n][i];
cout << res << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
init();
int test;
cin >> test;
while (test--) {
input();
solve();
}
}
|
cs |
궁금한점 혹은 모르는점 어떤 질문이든 댓글은 언제나 환영입니다.
'백준' 카테고리의 다른 글
백준 17472 다리 만들기 2 (0) | 2022.05.17 |
---|---|
백준 16437 양 구출 작전 (0) | 2022.05.17 |
백준 1103 게임 (0) | 2022.04.07 |
백준 20005 보스몬스터 전리품 (0) | 2022.03.30 |
백준 9328 열쇠 (0) | 2022.03.29 |