문제 링크 : https://www.acmicpc.net/problem/11057
11057번: 오르막 수
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.
www.acmicpc.net
문제설명
앞자리수가 뒷자리수보다 작거나 같은 수를 오르막수라고함 예를들면 11 12 13 18 126 이런숫자.
숫자의 길이가 주어졌을때 오르막 수의 개수를 구하는것 .
알고리즘
1. 배열을 만듦 arr[i][j] 여기서 i는 자리수고 j는 숫자. 예를들면 arr[1][7] 이면 첫번째 자리수는 7 요런느낌
2. 점화식 : arr[i][j] = arr[i][0]+...+arr[i][j] 이걸 적용하여서 풀면되는데 설명을 못하겠네..
코드로 보자..
코드
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
36
37
38
39
40
41
|
#include<iostream>
using namespace std;
int main() {
cin.tie(NULL);
ios::sync_with_stdio(0);
int dp[1001][10];
int n;
cin >> n;
//1번째 자리수 1로 초기화
for (int i = 0; i < 10; i++)dp[1][i] = 1;
//나머지는 0으로 초기화
for (int j = 2; j <= n; j++)
for (int i = 0; i < 10; i++)dp[j][i] = 0;
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][j] + dp[i - 1][k];
dp[i][j] = dp[i][j] % 10007;
}
}
}
int sum = 0;
//마지막에 n번째 자리수 오르막수를 다더함
for (int i = 0; i < 10; i++) {
sum = sum + dp[n][i];
sum %= 10007;
}
cout << sum;
}
|
cs |
'c++ > 백준' 카테고리의 다른 글
백준 1987: 알파벳 (0) | 2020.04.02 |
---|---|
백준 1449: 수리공 항승 (0) | 2020.04.02 |
백준 11052번: 카드 구매하기 (0) | 2020.03.25 |
백준 1699번: 제곱수의 합 (0) | 2020.03.25 |
백준 14503번: 로봇 청소기 (0) | 2020.03.25 |