파도반 수열

19 July 2019

문제 : https://www.acmicpc.net/problem/9461

이번은 피보나치 수와 비슷한 규칙을 찾아 동적 계획법으로 푸는 문제를 풀어보도록 하겠습니다.

#include<stdio.h>

long long getRet(int val);

static long long* waveArr = new long long[101];

int main(void) {

	int N;
	scanf("%d", &N);

	for (int i = 0; i < 101; i++)
	{
		waveArr[i] = 0;
	}
	waveArr[1] = waveArr[2] = waveArr[3] = 1;
	waveArr[4] = waveArr[5] = 2;

	for (int i = 0; i < N; i++)
	{
		int val;
		scanf("%d", &val);
		printf("%llu\n", getRet(val));
	}

	return 0;
}

long long getRet(int val) {
	if (waveArr[val] == 0)
	{
		waveArr[val] = getRet(val - 1) + getRet(val - 5);
	}
	return waveArr[val];
}
먼저 문제의 조건을 보도록 하겠습니다.
문제를 보면 아래와 같이 규칙이 반복되는 것을 찾을 수 있습니다.

f(1) = 1
f(2) = 1
f(3) = 1
f(4) = f(1) + f(3)
f(5) = f(1) + f(3)
f(6) = f(5) + f(1)
f(7) = f(6) + f(2)
f(8) = f(7) + f(3)
f(9) = f(8) + f(4)
f(10) = f(9) + f(5)
f(11) = f(10) + f(6)
위와 같이 f(n) = f(n-1) + f(n-5)로 나타낼 수 있으므로, 해당 규칙을 이용해 동적계획법을 이용해 풀어주도록 합니다.
주의할 점은 100을 입력하였을 때의 값이 Integer의 최대값을 벗어나게 되므로 값의 타입을 long long으로 선언해주어야 합니다.