[백준 11057 : C++] 오르막 수 / DP
풀이
오르막 수는 수의 자리가 오름차순을 이루는 수. (인접한 수가 같아도 오름차순으로 친다.)
수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램. (수는 0부터 시작)
DP 문제는 메모이제이션을 어떤 식으로 둬야할지에 대한 아이디어가 굉장히 중요한 거 같다.
이 문제에서는 메모이제이션을 D[i][j] // i: 수의 길이, j: 마지막 수 로 뒀다는게 중요한 포인트다.

코드
C++ 언어를 이용해 코드로 살펴보자.
#include <iostream> using namespace std; constexpr int mod = 10007; int N, ans; long long D[1001][10]; // D[i][j] = 수의 길이가 i이며 마지막 숫자가 j인 수의 오르막 수의 개수 int main() { cin >> N; for (int i = 0; i < 10; i++) D[1][i] = 1; // 길이가 1인 숫자들의 오르막 수 초기화 for (int i = 1; i <= N; i++) { for (int j = 0; j < 10; j++) { for (int k = 0; k <= j; k++) { // 길이가 i, 마지막 숫자가 j인 수의 오르막 수의 개수는 // 길이가 i-1이고 마지막 숫자가 j 이하인 오르막 수의 개수들의 모든 합으로 표현할 수 있다. D[i][j] += D[i - 1][k]; D[i][j] %= mod; } } } for (int i = 0; i < 10; i++) ans += D[N][i]; cout << ans % mod << "\n"; return 0; }
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준 2206 : JAVA] 벽 부수고 이동하기 / BFS (0) | 2020.09.08 |
---|---|
[백준 9370 : JAVA] 미확인 도착지 / 다익스트라 (0) | 2020.08.28 |
[백준 11559 : C++] Puyo Puyo / BFS, DFS (0) | 2019.10.18 |
[백준 2661 : C++] 좋은수열 / 백트래킹 (0) | 2019.09.28 |
[백준 2749 : C++] 피보나치 수 3 (0) | 2019.08.29 |
댓글
이 글 공유하기
다른 글
-
[백준 2206 : JAVA] 벽 부수고 이동하기 / BFS
[백준 2206 : JAVA] 벽 부수고 이동하기 / BFS
2020.09.08문제 풀이 2차원 평면이 주어질 때, 출발지에서 목적지까지의 단순 거리를 BFS 탐색을 통해 알아내는 문제다. 가장 기본적인 BFS 문제 유형에서 1개의 벽을 부술 수 있다는 한 가지 조건이 추가된 문제다. 추가된 위 조건으로 인해 생긴 고려사항은 다음과 같다. 기존에 (x, y) 좌표와 거리 값을 담는 distance 변수 외에 해당 좌표로 오기까지 벽을 부순 횟수를 저장할 변수가 하나 더 필요하다. 탐색할 다음 좌표가 벽이더라도 지금까지 벽을 부순 횟수가 0이라면 벽을 부수고 지날 수 있다. 기존에는 visited 변수를 통해 해당 좌표를 방문했는지만 체크했지만, 여기선 추가로 방문 여부 + 벽을 부순 횟수를 체크해야한다. 따라서, visited 변수를 boolean 타입이 아닌 int 타입으로 선언… -
[백준 9370 : JAVA] 미확인 도착지 / 다익스트라
[백준 9370 : JAVA] 미확인 도착지 / 다익스트라
2020.08.28문제 풀이 최단 경로를 구하는 문제로 다익스트라 알고리즘을 이용해 풀 수 있는 문제다. 위의 예제 입력에서 첫 번째 테스트 케이스를 그래프로 시각화해보자. 특정 목적지로의 최단 경로 중특정 경로를 포함하는지를 확인하는게 문제의 포인트다. 위 케이스의 최단 경로에서 2에서 3으로 가는 경로가 포함되어 있는지 확인하기 위해 생각해볼 수 있는 방법은 두 가지다. 첫 번째, (1 -> 2 최단거리) + (2 -> 3 최단거리) + (3 -> 5 최단거리) == (1 -> 5 최단거리) 또는 (1 -> 3 최단거리) + (3 -> 2 최단거리) + (2 -> 5 최단거리) == (1 -> 5 최단거리) 위 방법은 가장 간단하게 생각해볼 수 있는 방법이지만, 다익스트라 함수를 여러 번 호출해야하기 때문에 비효율적… -
[백준 11559 : C++] Puyo Puyo / BFS, DFS
[백준 11559 : C++] Puyo Puyo / BFS, DFS
2019.10.18문제 풀이 ( 문제를 이해하는데 30분 정도 걸렸고, 푸는데 2시간 정도 걸렸다. ) BFS로 풀었고 알고리즘은 아래처럼 적용했다. BFS를 통해 맵의 각 영역을 별도의 맵에 저장한다. (같은 색이라도 다른 영역에 있다면 구분한다.) 4개 이상의 뿌요를 가지는 영역이 없다면 종료한다. 해당 영역이 4개 이상의 뿌요를 가진다면 터뜨린다. 맵을 refresh한다. (중력에 따라 뿌요를 아래로 내릴 수 있다면 내린다.) 연쇄 + 1 1번부터 반복 (2번을 만날때 까지) 코드 C++ 언어를 이용하여 코드로 살펴보자. #include #include #include using namespace std; constexpr short ROW = 12; constexpr short COL = 6; constexpr s… -
[백준 2661 : C++] 좋은수열 / 백트래킹
[백준 2661 : C++] 좋은수열 / 백트래킹
2019.09.28문제 풀이 이 문제의 핵심은 좋은수열인지 판별하는 방법을 알아내는 것이다. 마지막 인덱스를 기준으로 길이를 1부터 시작해 (수열의 길이 / 2)까지 비교한다. 코드 C++ 언어를 이용하여 코드를 살펴보자. #include #include using namespace std; int N; string s; bool flag; void func(string t, int depth) { if (flag) return; int len = t.size(); for (int i = 1; i N) return; if (depth == N) { flag = true; cout N; func(s, 0); return 0; }
댓글을 사용할 수 없습니다.