전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

BOJ 11055 가장 큰 증가 부분 수열
PS/BOJ

BOJ 11055 가장 큰 증가 부분 수열

2021. 7. 4. 23:06

boj 11055 가장 큰 증가 부분 수열

boj 11053 가장 긴 증가하는 부분 수열과 풀이가 비슷한 문제이다. 다만 11053에서는 길이였다면 이번 문제에서는 수열의 합이 최대가 되어야한다. D[i]는 i번째 원소를 마지막으로 하는 증가 부분 수열의 합 중 최댓값이라고 정의한다. a[i]는 수열을 담는 배열이다. 문제에서 주어진 수열을 예시로 들자면, 아래와 같이 작동해야한다.

코드를 먼저 보고 코드에 대해 설명하겠다.

#include <iostream>
#include <algorithm>
using namespace std;

int n;
int a[1005];
int D[1005];
int mx;

int main(void)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];

    for (int i = 1; i <= n; i++)
    {
        D[i] = a[i];

        for (int j = 1; j < i; j++)
        {
            if (a[i] > a[j] && D[i] < D[j] + a[i])
                D[i] = D[j] + a[i];
        }
    }

    for (int i = 1; i <= n; i++) mx = max(mx, D[i]);

    cout << mx;
}

D[i]는 합이므로 초기 값은 a[i]로 초기화해준다. D[i] = D[j] + a[i]의 형태로 점화식이 정해지는데, 이것이 실행되는 조건이 이 문제의 핵심이다.

  • a[i] > a[j] (단, i > j)
    : 증가하는 수열이므로 위 조건을 만족해야만 한다.
  • D[i] < D[j] + a[i]
    : 위 조건을 만족하지 않으면 어떤 상황이 일어나는지 보자. i가 4이고 j가 2인 경우를 막 지나서 아래와 같은 상황이다.

D[i] < D[j] + a[i]라는 조건이 없으면, j가 3인 경우를 지나면서 아래와 같이 D[i]가 변하는 문제가 생긴다.

그러므로 위 두 조건을 만족해야만 한다.

저작자표시 (새창열림)

'PS > BOJ' 카테고리의 다른 글

BOJ 11054 가장 긴 바이토닉 부분 수열  (0) 2021.07.06
BOJ 11722 가장 긴 감소하는 부분 수열  (0) 2021.07.04
BOJ 11053 가장 긴 증가하는 부분 수열  (0) 2021.07.04
BOJ 7576 토마토  (0) 2021.07.01
BOJ 2156 포도주 시식  (0) 2021.07.01
    'PS/BOJ' 카테고리의 다른 글
    • BOJ 11054 가장 긴 바이토닉 부분 수열
    • BOJ 11722 가장 긴 감소하는 부분 수열
    • BOJ 11053 가장 긴 증가하는 부분 수열
    • BOJ 7576 토마토
    모달조아
    모달조아

    티스토리툴바