기타등등/알고리즘 기록

[C++] DP - 네트워크 선 자르기(Bottom-Up)

CodeJB 2021. 8. 17. 15:20
아주 복잡하고 큰 문제를 직관적으로 알 수 있을 정도로 작은 단위로 바꾸고 그 답을 구한 다음
큰 문제로 점차 늘려가며 정답을 구한다.

int dy[50];//다이나믹 배열

#include <iostream>

using namespace std;
int main() {
    ios_base::sync_with_stdio(false);
    int n;
    cin >> n;
    dy[1] = 1;
    dy[2] = 2;//작게 쪼갰을때 알 수 있는 해를 미리 저장해놓는다.
    
    for(int i = 3; i <= n; i++){
        dy[i] = dy[i-2]+dy[i-1];//규칙성을 잘 파악해보자
    }
    
    cout << dy[n];
    
    return 0;
}
  • 문제에서 주어진 네트워크 선은 3~45미터이다. 이 선을 1m혹은 2m로 잘랐을 때 경우의 수를 구해야 한다.
  • 경우의 수 문제이기 때문에 DFS로도 해결할 수 있을 수 있다.
  • 하지만, DP의 Bottom-up방식으로도 해결이 가능하다.
  • 일단 문제를 아주 작은 단위로 바꾸어본다.
  • 1m를 1m혹은 2m로 자르는 방법은? 당연히 1가지이다. 따라서 dy[1] = 1로 기록한다.
  • 2m를 1m혹은 2m로 자르는 방법은? 당연히 2가지이다. 따라서 dy[2] = 2로 기록한다.
  • 여기까지는 우리가 직관적으로 알 수 있기 때문에 미리 값을 할당시켜놓는다. 
  • 문제에서  출력값을 알려줬는데 7m의 경우에는 답이 21이 나온다. 따라서 점화식을 만들어보면
  • dy[N] = dy[N-2] + dy[N-1]임을 알 수 있다.
  • 참고로, 다이나믹 테이블은 무조건 정답을 기록해놓는 공간이다. 이 문제에서 원하는 출력은 최대 길이이다.
  • 따라서, 각 인덱스는 네트워크 선을 의미하며 그 안의 값을 최대 길이가 들어가야만 한다.
https://www.inflearn.com/course/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/dashboard