일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c++ 조합
- C++ 9996
- 운영체제
- C# 병합정렬
- 월곡역 학원
- 서울사대부고 학원
- 고정 소수점
- 백준 1049번 기타줄
- OS
- 백준 패션왕 신해빈
- 백준 10709
- 상월곡동 학원
- 백준 2309번 일곱 난쟁이
- 백준 1049번
- DFS
- 성북구 학원
- 백준 14246번 K보다 큰 구간
- 월곡중학교 학원추천
- 백준 9375번 패션왕 신해빈
- 관리형 학원
- C++ 문자열
- 월곡중 학원
- 백준 K보다 큰 구간
- 상월곡역 학원
- c++ split
- 백준 dfs
- 백준 한국이 그리울 땐 서버에 접속하지
- 월곡동 학원추천
- 백준 토마토
- 백준 14246번
- Today
- Total
키베이루's diary
[C++] 백준 11057번 오르막 수 본문
1) 문제설명
https://www.acmicpc.net/problem/11057
11057번: 오르막 수
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수
www.acmicpc.net
2) 아이디어
전에 풀었던 쉬운 계단 수와 비슷한 문제이다.
https://kiveiru.tistory.com/16?category=557953
[C++] 백준 10844번 쉬운 계단 수
1) 문제설명 https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 2) 아이디어 dp를 이중배열로 받아서 (i / j) 의 인덱..
kiveiru.tistory.com
DP의 정의를 DP [자릿수][마지막 수] = 가능한 수의 개수로 설정하고 점화식을 세우기 위해 표를 만들어서 규칙을 찾는다.
한자리 수일 때는 모두 0~9까지 하나씩밖에 올 수 없기 때문에 가능한 수의 개수는 1씩 할당된다.
두 자릿수일 때는
마지막 수가 0일 때 : 00
마지막 수가 1일 때 : 01, 11
마지막 수가 2일 때 : 02, 12, 22
...
세 자릿수 일 때는
마지막 수가 0일 때 : 000
마지막 수가 1일 때 : 001, 011, 111
마지막 수가 2일 때 : 002, 012, 022, 112, 122, 222
...
이런 식으로 세어서 표를 만든다. DP [자릿수][마지막수]의 규칙은 = DP [자릿수][마지막수-1]+ DP [자릿수-1][마지막수] 임을 알 수 있다.
자릿수/ 마지막수 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 1 |
3 | 3 | 6 | 10 | 15 | 21 | 28 | 36 | 45 | 55 | 1 |
3) 코드
#include<iostream>
#include<queue>
#include<deque>
#include<string.h>
#include<math.h>
#include<cmath>
#include<stack>
#include<algorithm>
using namespace std;
long long dp[1001][11]; // dp[자릿수][마지막수]
int main() {
int n;
long long sum = 0;
cin >> n;
for (int i = 0; i < 10; i++) {
dp[1][i] = 1; // 자릿수가 1일때
}
for (int i = 2; i <= n; i++) {
for (int j = 0; j < 10; j++) {
if (j == 1) {
dp[i][j] = (dp[i - 1][j] + 1) % 10007;
}
else {
dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % 10007;
}
}
}
for (int i = 0; i <= 9; i++) {
sum = (sum + dp[n][i]) % 10007; // n자릿수의 0~9까지 가능한 수의 갯수를 전부 더한다.
}
cout << sum;
}
'알고리즘 > DP' 카테고리의 다른 글
[C++] 백준 13398번 연속합 2 (0) | 2022.07.13 |
---|---|
[C++] 백준 1309번 동물원 (0) | 2022.07.11 |
[C++] 백준 15988번 1, 2, 3 더하기 3 (0) | 2022.07.11 |
[C++] 백준 11660번 구간 합 구하기 5 (0) | 2022.07.09 |
[C++] 백준 14501번 퇴사 (0) | 2022.06.24 |