끄적끄적 코딩
article thumbnail

다이나믹 프로그래밍 문제입니다.

각 자리수가 한자리 부터 모든 경우의 수를 채우고
다음은 두자리 ... 세자리 ... 네자리 ... n자리 까지 채웁니다.

A자리는 A-1자리에서 뒷자리수가 현재 수보다 작은 것들의 합 + 1을 해주면됩니다.
이렇게 되면 9의경우 0~8까지 수를 전부 더한 뒤 + 1을 해줘야하고
8도 0~7까지 수를 전부 더한 뒤 +1을 해줘야합니다.

여러 번 반복해야하는 경우가 생기므로 다른 방법을 찾아보았습니다.
뒷자리수가 B일때 B-1은 나머지 DP[B]의 값을 제외하고 모든 값을 가지고 있습니다.
그래서 DP[B] = DP[B-1] + DP[B]라는 점화식을 세울 수 있습니다.

(뒷자리수)
DP[1] = DP[1] + 1
DP[2] = DP[2] + DP[2 - 1] + 1
DP[3] = DP[3] + DP[3 - 1] + 1
...
DP[9] = DP[9] + DP[9 - 1] + 1

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int main(int argc, char* argv[])
{
	int ts;
	int n;
	long long result = 0;
	long long DP[10];
	
	cin >> ts;

	while (ts--) {
		result = 0;

		cin >> n;

		fill(DP, DP + 10, 1);
		DP[0] = 0;

		for (int i = 2; i <= n; ++i) {
			DP[1] = DP[1] + 1;
			for (int j = 2; j <= 9; ++j) {
				DP[j] = DP[j - 1] + DP[j];
			}
		}

		for (int i = 0; i <= 9; ++i) {
			result += DP[i];
		}

		cout << result + 1 << endl;
	}

	return 0;
}

검색 태그