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

 

Proof by ac로 풀었습니다. 무슨 말이냐면 대충 감으로 때려맞췄다는 것;

 

대충 몇 케이스를 손으로 그려보면 1, 2, 3, 5, ... 순으로 증가합니다

뭔가 피보나치같죠? dp[i] = dp[i-2] + dp[i-1]로 풀면 됩니다

..

 

그래도 증명이 좀 있어야겠죠?

n번째 케이스를 생각해보면 맨 밑 노드는 한 줄이 일자로 연결되거나, 두 줄이 X자로 연결되는 경우가 있는데 이 때 경우의 수가 n-1번째 경우와 n-2번째 경우를 더한 것과 같습니다.

Good Bye, BOJ 2019에 나온 문제인데 에디토리얼도 확인해보세요.

#pragma GCC optimize ("Ofast")

#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING

#include <bits/stdc++.h>
using namespace std;


const int MOD = 1000000007;

int dp[191230];

int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);

	
	dp[1] = 1;
	dp[2] = 2;
	for (int i = 3; i <= 191229; ++i)
		dp[i] = (dp[i - 1] + dp[i - 2])%MOD;

	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		cout << dp[n] << '\n';
	}
	
	return 0;
}
반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 1080: 행렬  (0) 2020.08.12
[백준][C++] 1120: 문자열  (0) 2020.08.11
[백준][C++] 10610: 30  (0) 2020.08.09
[백준][C++] 1049: 기타줄  (0) 2020.08.08
[백준][C++] 5462: POI  (0) 2020.08.07