Algorithm

[Algorithm] Dynamic Programming (2) - Rod Cutting

타자씨 2022. 10. 25. 00:10

1. rod - cutting problem 이란

  

rod-cutting 이란 전체 길이 n인 막대와 길이 별 가격이 주어졌을 때, 해당 막대를 잘라서 얻을 수 있는 최대수익을 r_n을 구하는 문제이다.

 

brute-force approach 를 사용하면 2^(n-1)의 possible way를 전부 계산해야 한다. 

 

길이가 n인 막대는 n-1번의 자를 수 있는 틈이 있고, 각각의 틈에는 자른다vs자르지 않는다의 경우가 있기 때문에 2^(n-1)개의 possible way가 있다.

길이가 4인 막대를 1-3으로 잘라 8의 수익을 얻은 경우 vs 2-1-1로 잘라 7의 수익을 얻은 경우

 

2. 동적 프로그래밍을 이용해서 rod - cutting problem 해결하기

 

위 그림을 통해 rod - cutting problem을 해결하기 위한 동적 프로그래밍을 이해할 수 있다. 

  • p_1 + r_n-1  식은 길이가 1일 때 가격 + 길이가 n-1일 때 최대수익을 의미한다.
  • p_1, p_2,,, p 까지 n가지의 경우를 확인하고 최종적으로 r_n을 구할 수 있다.

rod - cutting problem을 해결하기 위한 동적 프로그래밍 식을 간단하게 표현하면 다음과 같이 쓸 수 있다.

 

혹시 이 식이 이해가 안된다면 간단하게 확인해 볼 수 있다.

  • p_1 + r_3 일 때 : (b), (e), (f), (h) 를 살펴볼 수 있음.
  • p_2 + r_2 일 때 : (c), (g)를 살펴볼 수 있음.
  • p_3 + r_1 일 때 : (d) 를 살펴볼 수 있음
  • p_4 + r_0 일 때 : (a) 를 살펴볼 수 있음.
    • r_n = max (p_i + r_n-i) 를 통해 possible way를 전부 살펴 볼 수 있음을 간단하게 확인할 수 있다.

 


 

r_n = max (p_i + r_n-i) 식이 rod - cutting problem을 풀 수 있다는 것을 이해했으면, 해당 식을 통해 어떻게 rod - cutting 문제를 푸는지에 대해 알아보자.

 

Assembly - line scheduling 문제처럼 우리는 표를 통해 rod - cutting problem을 정리 할 수 있다.

r[i]를 통해 주어진 막대의 길이에 따른 최대수익을 확인할 수 있다. 

  • EX ) 막대의 길이가 8일 때 최대수익은 22이다.

s[i]를 통해서는 최대수익을 얻으려면 어떻게 막대를 잘라야 하는지 알 수 있다.

  • EX ) 막대의 길이가 8일 때 최대수익을 얻는 cutting는 2 + 6이다.
    • i가 8일 때, s[8]은 2로, 2 + 6 형태이다. 2는 s[8]에서 구한 값이기 때문에 변하지 않지만, 6은 최대값을 확인해야 한다.
    • i가 6일때, s[6]은 6으로 6 + 0 형태이다.
    • 그러므로 막대의 길이가 8일 때 최대수익을 얻는 cutting은 2 + 6 이다.

 

 

3. rod - cutting problem 수도코드

 

 

4. rod - cutting problem의 Space Consumption & Running Time

 

  • Space Consumption

n (in table r)+ n (in table s) = Θ(n)

  • Running Time

i가 1일 때 계산 1번, i가 2일 때 계산 2번... i가 n일 때 계산 n번