문제 링크
풀이
DP
로 푸는 문제
1자리 수일 때는 0~9
까지 10개
2자리 수일 때는 00~09
, 11~19
~ 99
해서 55개이다.
규칙은 n
길이의 맨 첫번째 숫자가 만약 5
라고 한다면 n-1
길이의 숫자에서 55~99
까지의 개수가 5
로 시작하는 오르막 수의 개수일 것이다.
3
길이의 5
로 시작하는 오르막 수를 구한다면,555~559
, 566~569
, ..., 588~589
, 599
가 될 것이다. 해당 범위로 자른 이유는 n-1
길이에서 55~59
의 개수, 66~69
의 개수 .. 를 구했을 것이기 때문이다.
점화식은 arr[n][i] = arr[n-1][i] + arr[n][j+1]
(누적합으로 구해줄 것임)
코드
#include <iostream>
#include <vector>
#define mod 10007
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
vector<vector<int>> arr(n + 1, vector<int>(10));
for (int i = 0; i < 10; i++)
{
arr[0][i] = 1;
}
for (int i = 1; i <= n; i++)
{
arr[i][9] = 1;
for (int j = 8; j >= 0; j--)
{
arr[i][j] = ((arr[i][j + 1] % mod) + (arr[i - 1][j] % mod)) % mod;
}
}
cout << arr[n][0];
}
문제 링크
풀이
DP
로 푸는 문제
1자리 수일 때는 0~9
까지 10개
2자리 수일 때는 00~09
, 11~19
~ 99
해서 55개이다.
규칙은 n
길이의 맨 첫번째 숫자가 만약 5
라고 한다면 n-1
길이의 숫자에서 55~99
까지의 개수가 5
로 시작하는 오르막 수의 개수일 것이다.
3
길이의 5
로 시작하는 오르막 수를 구한다면,555~559
, 566~569
, ..., 588~589
, 599
가 될 것이다. 해당 범위로 자른 이유는 n-1
길이에서 55~59
의 개수, 66~69
의 개수 .. 를 구했을 것이기 때문이다.
점화식은 arr[n][i] = arr[n-1][i] + arr[n][j+1]
(누적합으로 구해줄 것임)
코드
#include <iostream>
#include <vector>
#define mod 10007
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
vector<vector<int>> arr(n + 1, vector<int>(10));
for (int i = 0; i < 10; i++)
{
arr[0][i] = 1;
}
for (int i = 1; i <= n; i++)
{
arr[i][9] = 1;
for (int j = 8; j >= 0; j--)
{
arr[i][j] = ((arr[i][j + 1] % mod) + (arr[i - 1][j] % mod)) % mod;
}
}
cout << arr[n][0];
}