POJ 2479 Maximum sum (2 단 연속 과 최대)

4695 단어 poj
제목:
n 개의 수 를 정 하고 연속 적 인 2 단 을 선택 하여 2 단의 합 을 최대 로 합 친다.
생각:
1. 연속 최대 부분 과 이미 매우 전형 적 인 문제 이 므 로 선형 알고리즘 으로 구 할 수 있다.
2. 2 단 연속 최대 화 에 대해 분 치 전략 을 채택 할 수 있 습 니까?
   분계 점 i 에 대해 앞의 i 개 수의 최대 연속 과 뒤의 n - i 개의 최대 연속 과 더 불어 요구 하 는 결과 라 도.
   뒤의 n - i 개의 최대 연속 과 거꾸로 유도 해 야 합 니 다.
#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <climits>



const int MAXN = 50010;

int an[MAXN];

int d1[MAXN], d2[MAXN];



int main()

{

    int cases;

    scanf("%d", &cases);

    while (cases--)

    {

        int n;

        scanf("%d", &n);



        for (int i = 1; i <= n; ++i)

            scanf("%d", &an[i]);



        int tmax = INT_MIN, temp = 0;

        for (int i = 1; i <= n; ++i)

        {

            temp += an[i];

            if (tmax < temp)

                tmax = temp;

            if (temp < 0)

                temp = 0;

            d1[i] = tmax;

        }

        tmax = INT_MIN, temp = 0;

        for (int i = n; i >= 1; --i)

        {

            temp += an[i];

            if (tmax < temp)

                tmax = temp;

            if (temp < 0)

                temp = 0;

            d2[i] = tmax;

        }



        int ans = INT_MIN;

        for (int i = 1; i < n; ++i)

            if (ans < d1[i] + d2[i+1])

                ans = d1[i] + d2[i+1];



        printf("%d
", ans); } return 0; }

좋은 웹페이지 즐겨찾기