최대 연속 서브 그룹

12535 단어 알고리즘
최대 연속 서브 그룹
  • 배열 A [0,..., n - 1] 을 정 하고 A 의 연속 적 인 하위 배열 을 구하 여 이 하위 배열 의 합 을 최대 로 합 니 다.
  • 예 를 들 면:
  • 배열: 1, - 2, 3, 10, - 4, 7, 2, - 5
  • 최대 서브 그룹: 3, 10, - 4, 7, 2

  • 폭력 법
  • 직접 A [i,... j] 의 값
  • 0 ≤ \leq ≤ i < n
  • i ≤ \leq ≤ j < n
  • i, i + 1,..., j - 1, j 의 최대 길 이 는 n
  • 이다.
  • 따라서 시간 복잡 도 O (n 3 n ^ 3 n3)
  • Code
    public int MaxSubArray(int[] A, int n) {
            int maxSum = A[0];
            int currSum;
            for (int i = 0; i < n; i++) {
                for (int j = i; j < n; j++) {
                    currSum = 0;
                    for (int k = i; k <= j; k++) {
                        currSum += A[k];
                    }
                    if (currSum > maxSum) {
                        maxSum = currSum;
                    }
                }
            }
            return maxSum;
        }
    

    분 치 법
  • 배열 을 중간 에서 나 누 면 가장 큰 하위 배열 은 완전히 왼쪽 배열 에 있 거나 오른쪽 배열 에 있 거나 분계 점 에 걸 쳐 서 있다.
  • 왼쪽 배열, 오른쪽 배열 에서 완전히 해결 된다.
  • 분계 점 에 걸 쳐 서 있다. 사실은 왼쪽 배열 의 최대 접미사 와 오른쪽 배열 의 최대 접두사 의 합 이다.따라서 분계 점 에서 앞으로 쓸 고 뒤로 쓸 면 된다.
  • 시간 복잡 도 는 O (n l o g 2 n nlog 2n nlog 2 n)
  • Code
    public int MaxAddSub(int[] a, int from, int to) {
            if (to == from) {
                return a[from];
            }
    
            int middle = (from + to) / 2;
            int m1 = MaxAddSub(a, from, middle);
            int m2 = MaxAddSub(a, middle+1, to);
    
            int left = a[middle];
            int now = a[middle];
            for (int i = middle-1; i >= from; i--) {
                now += a[i];
                left = max(left, now);
            }
            int right = a[middle+1];
            now = a[middle+1];
            for (int i = middle+2; i <= to; i++) {
                now += a[i];
                right = max(right, now);
            }
            int m3 = left + right;
            return max(max(m1, m2), m3);
        }
    

    동적 계획
  • 기 S [i] 는 A [i] 로 끝 나 는 배열 과 가장 큰 하위 배열
  • 이다.
  • 는 S [i + 1] = max (S [i] + A [i + 1], A [i + 1])
  • S[0] = A[0]
  • i: 0 ≤ \ \ leq ≤ i ≤ \ \ le ≤ n - 1
  • 옮 겨 다 니 기
  • 동태 계획: 최 우수 서브 문제
  • 시간 복잡 도: O (n)
  • public int MaxAddSub2(int[] a) {
            int result = a[0];
            int sum = a[0];
            for (int i = 1; i < a.length; i++) {
                if (sum > 0) {
                    sum += a[i];
                } else {
                    sum = a[i];
                }
                if (sum > result) {
                    result = sum;
                }
            }
            return result;
        }
    

    좋은 웹페이지 즐겨찾기