분할정복 정리

Untitled

ex :

KakaoTalk_20211020_164024162.png

Untitled

→ 풀이방법 : $O(n^3), O(n^2), O(nlogn), O(n)$

  1. $O(n^3)$ 방법 : 중복조합 ${n}H{2}$ (서로 다른 n개에서 중복을 허용하여 r개를 선택함)

  2. $O(n^2)$ 방법 : 중복조합 ${n}H{2}$ 사용 → 이전에 구했던 합을 재활용

  3. $O(nlogn)$ 방법 : Divide & Conquer

  4. $O(n)$ 방법 : 최대 부분합 수열의 성질 이용

1) $O(n^3)$

Untitled

Untitled

#include <iostream>
using namespace std;

int maxSubSum1(int* A, int n){
	int max = 0;
	for(int i = 0; i<n; i++){
		for(int j = i; j<n; j++){
			int sum = 0;
			for(int k = i; k<=j; k++){
				sum = sum + A[k];
			}
			if(sum > max){
				max = sum;
			}
		}
	}
	return max;
}

int main() {
  int A[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
  int size = sizeof(A)/sizeof(A[0]);
  int max = maxSubSum1(A, size);
  cout<<max<<endl;
}
/* 출력결과
43 */

2) $O(n^2)$

Untitled