11057번 오르막 수
📝문제링크 : www.acmicpc.net/problem/11057
이전에 풀었던 쉬운 계단수 문제와 아주 유사하다.
오르막수가 0으로 끝나려면 0의 앞자리엔 0만 올 수 있다.
오르막수가 1로 끝나려면 1의 앞자리엔 0과 1이 올 수 있다.
오르막수가 2로 끝나려면 1의 앞자리엔 0과 1과 2가 올 수 있다.
.
.
.
오르막수의 끝자리가 L 인 경우 L의 앞자리엔 0부터 L까지의 수가 올 수 있다.
i 는 2부터 N까지, j는 0부터 9까지, k는 0부터 j까지 3중 for문을 돌면 풀 수 있다.
소스코드
#include <iostream>
using namespace std;
int main()
{
    int	N;
    cin >> N;
    // dp[N][L] : N자리 오르막수에 대해, 끝자리가 L인 수의 개수
    int dp[1001][10];
    //set initial value
    for(int i = 0; i < 10; i++)
        dp[1][i] = 1;		
    for(int i = 2; i <= N; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            dp[i][j] = 0;
            for (int k = 0; k <= j; k++)
                dp[i][j] = (dp[i][j] + dp[i - 1][k]) % 10007;
        }
    }
    int sum = 0;
    for(int j = 0; j < 10; j++)
	    sum = (sum + dp[N][j]) % 10007;	
    cout << sum << '\n';
    return (0);
}
c++ 문법 new랑 delete 이용해서 이 코드 다시 짜보기
2차원 배열 메모리 할당 및 해제 방법
👇 new로 할당
| int sizeX = 5; int sizeY = 10; int **arr = new int*[sizeY]; for (int i = 0; i < Y; i++)     arr[i] = new int[sizeX]; | 
👇 delete로 해제
| for(i = 0; i < sizeY; i++)     delete[] arr[i]; delete arr[]; | 
👇 다시 짠 코드
더보기
#include <iostream>
using namespace std;
int main()
{
	int	N;
	cin >> N;
	//dynamic allocation of memory
	int	**dp = new int*[N + 1];
	for (int i = 0; i < N + 1; i++)
		dp[i] = new int[10];
	
	//set initial value
	for(int i = 0; i < 10; i++)
		dp[1][i] = 1;		
	for(int i = 2; i <= N; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			dp[i][j] = 0;
			for (int k = 0; k <= j; k++)
			{
				dp[i][j] = (dp[i][j] + dp[i - 1][k]) % 10007;
			}
		}
	}
	
	int sum = 0;
	for(int j = 0; j < 10; j++)
		sum = (sum + dp[N][j]) % 10007;	
	cout << sum << '\n';
	
    //delete
	for(int i = 0; i < (N + 1); i++)
		delete[] dp[i];
	delete[] dp;
	return (0);
}
- 백준 2193번 이친수 문제도 이 유형과 아주 유사하다. 이친수 문제는 포스팅 생략.
'알고리즘 > Problem Solving' 카테고리의 다른 글
| [BOJ] DP 2156 포도주 시식 C++ (0) | 2020.12.27 | 
|---|---|
| [BOJ] DP 9465번 스티커 C++ (0) | 2020.12.24 | 
| [BOJ] DP 10844번 쉬운 계단 수 C++ (0) | 2020.12.03 | 
| [BOJ] DP 9095번 1, 2, 3 더하기 C++ (0) | 2020.11.24 | 
| [BOJ] DP 11726번 & 11727번 2xn 타일링 C++ (1) | 2020.11.23 | 
 
									
								 
									
								 
									
								