Dynamic Programming이란?

막대 자르기 문제

강철 막대를 길이에 따라 다르게 가격을 매겨서 팔려고 한다. 길이에 대한 가격은 다음과 같다. 길이가 n인 막대를 어떻게 잘라야 최대 이익으로 팔 수 있을까?

Untitled

#include <iostream>
#include <algorithm>
#define MAX -12345
using namespace std;

int bottomUpCutRod(int* p, int n, int size){
	int r[size];
	r[0] = 0;
	int q;

	for(int j = 1; j<=n; j++){
		q = MAX;
		for(int i = 1; i<=j; i++){
			q = max(q, p[i] + r[j-i]);
		}
		r[j] = q;
	}
	return q;
}

int main() {
  int n;
  int p[11] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
  int size = sizeof(p)/sizeof(p[0]);
  cin>>n;
  int buresult = bottomUpCutRod(p, n, size);
  cout<<buresult<<endl;
}

행렬의 곱셈 문제

n개의 행렬 $A_1, A_2, A_3, \cdots, A_n$ 이 주어져있고, $A_i$ 는 $p_{i-1} \times p_i$ 행렬이다. 모든 행렬을 곱할 때 어떤 순서로 구해야 수행시간이 최소로 걸릴까?

행렬 X,Y 를 곱할 때 (XY)로 표기한다.