근복적으로 문제를 보자마자 어떻게 풀지 감이 안온다.
-> 이거 일일이 노가다 해볼까? 라는 생각이 들 정도로
입력이 7인데 출력을 21 이 나오는 것을 통해 7을 1,2로
일일이 잘라서 확인하기에는 어렵다. 21번 확인을 해야하므로
-> 이러한 상황에서 진짜 딱 직관적으로 번뜩여야 한다!
=> 프로그래밍적으로 생각하면 안되.
일단 생각해야 한다.
예시에 있는 5가지 예시에도 꽂히면 안된다..
작은 단위로 해볼까? 생각이 안날게 뻔하지만..
네트워크 선이 1일 때는 1로 자를 수 있다. -> 1개
네트워크 선이 2일 때는 1 + 1 / 2로 자를 수 있다. -> 2개
네트워크 선이 3일 때는 1 + 1 + 1 / 1 + 2 / 2 + 1 -> 3개
네트워크 선이 4일 때는 1 + 1 + 1 + 1 / 1 + 1 + 2 / 1 + 2 + 1 / 2 + 1 + 1
// 2 + 2 -> 총 5개
해보니까 규칙을 발견했다...
재귀 사용
-> 끄적여보면 재귀를 사용하면 될것 같았음.
dp 사용
: 어떻게 작성해야 할지 모를때는 경우의 수를 만들어보자.
-> 점화식을 만들 수 있따.
d[3] = d[1] + d[2];
d[4] = d[3] + d[2];
void recur(int n, int&cnt)
{
if (n == 0)
{
cnt++;
return;
}
if(n - 1 >= 0)
recur(n - 1, cnt);
if (n - 2 >= 0)
recur(n - 2, cnt);
}
int main(void)
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
int n;
cin >> n;
int cnt = 0;
recur(n, cnt);
cout << cnt;
return 0;
}
int main(void)
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
int n;
cin >> n;
int cnt = 0;
vector<int>dp(n);
dp[0] = 1;
dp[1] = 2;
for (int i = 2; i < n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2];
}
cout << dp[n -1];
return 0;
}