반응형

문제링크:https://www.acmicpc.net/problem/1309

 

1309번: 동물원

첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.

www.acmicpc.net

 

dp문제입니다!

n일때의 경우의수는 n-1일때와 관계가 있습니다.

 

n번째 줄에 사자가 없을때 왼쪽에 있을때 오른쪽에 있을때 이렇게 3가지로 나눠보겠습니다. 

0인덱스가 사자가 없을때 1인덱스가 왼쪽에 있을때 2인덱스가 오른쪽에 있을때 입니다.

 

1. n번째 줄에 사자가 없을때

  • dp[i][0] = dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2];

2. n번째 줄에 왼쪽에 사자가 있을때

  • dp[i][1] = dp[i - 1][0] + dp[i - 1][2];

3. n번째 줄에 오른쪽에 사자가 있을때

  • dp[i][2] = dp[i - 1][0] + dp[i - 1][1];

 

9901로 계속 나눠주면서 결과를 도출하는 것도 잊으시면 안됩니다. 

증가하는 규칙을 찾으면 정말 쉬운 문제였습니다.

 

정답코드입니다.

#include <iostream>
using namespace std;
int dp[100001][3] = { 0 };
int n = 0;
int main() {
	cin >> n;
	dp[1][0] = 1, dp[1][1] = 1, dp[1][2] = 1;

	for (int i = 2; i <= n; i++) {
		dp[i][0] = dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2];
		dp[i][1] = dp[i - 1][0] + dp[i - 1][2];
		dp[i][2] = dp[i - 1][0] + dp[i - 1][1];

		dp[i][0] %= 9901;
		dp[i][1] %= 9901;
		dp[i][2] %= 9901;
	}

	cout << (dp[n][0] + dp[n][1] + dp[n][2]) % 9901 << endl;

}

 

 

반응형

+ Recent posts