https://www.acmicpc.net/problem/11057
dp를 사용하여 푼 문제
끝자리의 숫자에 따라 오르막수의 수를 따로 배열에 저장해주었다.
따라서 dp[1001][10] 다차원 배열을 선언해준뒤
1의 자리의 경우 0이 앞에 있는것을 허용하므로 dp[0][0~9]까지 1을 넣어준다.
또한 dp[1][0] 의 경우 오르막수가 되려면 앞자리가 0인 경우밬에 없으므로 dp[0][0]값만 넣어주고
dp[1][1]의 경우 오르막수가 되려면 앞자리가 0과 1인경우이므로 dp[0][0] 과 dp[0][1]을 넣어준다. 삼중 for문을 이용하여 이를 구현해주었다.
for (int i = 1; i < n; i++) {
for (int j = 0; j <= 9; j++) {
for (int k = 0; k <= j; k++) {
dp[i][j] += (dp[i - 1][k]) % MODULER;
}
}
}
예제는 모두 맞혔지만 시간초과가 아닌 문제를 틀렸고 이유를 찾았다.
dp[i][j] += (dp[i - 1][k]) % MODULER;
이 줄을 살펴 보면 moduler가 저 하나의 값에만 나누어주는것을 볼수 있다. 따라서 코드를
dp[i][j] = (dp[i][j] + dp[i - 1][k]) % MODULER;
이런식으로 바꿔주었다.
전체코드는
#include <iostream>
#include <algorithm>
#define MODULER 10007
using namespace std;
int dp[1001][10] = { 0, };
int main(int argc, char* argv[])
{
int n;
cin >> n;
for (int i = 0; i <= 9; i++) {
dp[0][i] = 1;
}
for (int i = 1; i < n; i++) {
for (int j = 0; j <= 9; j++) {
for (int k = 0; k <= j; k++) {
dp[i][j] = (dp[i][j] + dp[i - 1][k]) % MODULER;
}
}
}
for (int i = 0; i <= 9; i++) {
dp[n][0] = (dp[n][0] + dp[n - 1][i]) % MODULER;
}
cout << dp[n][0] << '\n';
return 0;
}
좀 더 감이 잡힌다.
'코딩테스트 > C++' 카테고리의 다른 글
[백준 C++] 2156번: 포도주 시식 (0) | 2024.05.12 |
---|---|
[백준 C++] 9465번: 스티커 (0) | 2024.05.12 |
[백준 C++] 1309번: 동물원 (0) | 2024.05.12 |
[백준 C++] 1149번: RGB거리 (0) | 2024.05.12 |
[백준 C++] 15988번: 1, 2, 3 더하기 3 (0) | 2024.05.11 |