알고리즘 문제

[C/C++ 백준 1309번] 동물원 (Silver 1)

새파란 공대생 2020. 5. 26. 11:02

https://www.acmicpc.net/problem/1309

 

1309번: 동물원

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

www.acmicpc.net

2 * i에 대해 가능한 경우의 수 dp[i]라고 했을 때, 사자를 한 마리 넣어보면 dp만으로 계산할 수 없다는 것을 알 수 있다. 한칸만 튀어나온 꼴의 경우의 수도 따로 계산해서 dp2[i]로 만들어 주자.

 

즉,

                   
                   

이런 꼴의 모양이 dp[10]이고,

                  X
                   

이런식으로 한칸 비운것이 dp2[10]이다. 이 둘에 대해 점화식을 쓰는 건 그리 어렵지 않아 쉽게 풀 수 있다.

 

#include <cstdio>
int main(void){
	int N, dp1[100001]={0,3,7,17,},dp2[100001]={0,2,5,};
	scanf("%d",&N);
	for(int i=3; i<=N; i++){
		dp1[i]=2*dp2[i-1]+dp1[i-1];
		dp2[i]=dp2[i-1]+dp1[i-1];
		dp1[i] %= 9901;
		dp2[i] %= 9901;
	}
	printf("%d",dp1[N]);
}