[백준 / C++] 가장 큰 증가하는 부분 수열 (실버2, 11055)

2024. 10. 12. 14:03·코딩테스트/백준 (Study)
728x90
반응형

문제

수열 A가 주어졌을 때, 그 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가하는 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다.

입력

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

출력

첫째 줄에 수열 A의 합이 가장 큰 증가하는 부분 수열의 합을 출력한다.

예제 입력 1

10
1 100 2 50 60 3 5 6 7 8

예제 출력 1

113

문제 풀이

이번 문제는 주어진 수열 A에서 증가하는 부분 수열 중 가장 큰 합을 구하는 문제입니다.

 

일반적인 방식으로 생각한다면 모든 칸을 순회하며 자기보다 큰 칸을 탐색하고, 해당 값을 누적하는 방식으로도 풀 수 있으나, 문제에서 주어진 수열의 최대 길이가 1000이므로 시간 초과가 나오게 됩니다.

 

즉, 현재 칸에서 얻을 수 있는 최대값을 저장해두고, 그보다 낮은 수가 나오는 경우는 전부 가지치기를 해주며 다음 칸으로 이동해주는 방식으로 문제에 접근할 수 있습니다.

 

저의 경우 재귀 방식을 사용해 전체를 탐색하며 DP 배열에 현재 칸에서의 최대값을 저장하였고, 그보다 큰 수가 나오는 경우로만 반복해서 탐색을 진행하는 방식으로 문제를 해결하게 되었습니다.

 

처음에는 무조건 현재 칸보다 큰 수로만 탐색을 진행하였으나, 그 결과 첫 번째 수가 무조건 포함되는 가장 큰 수가 나왔으며 2번의 실패를 받았고 이후 로그를 찍어보며 모든 수로 분기하는 방식으로 수정하여 문제를 해결 하였습니다.

코드

더보기
#include <iostream>

using namespace std;

int n;
int arr[1002];
int DP[1002];

void Go(int num, int sum)
{
	if (num == n - 1)
	{
		DP[n - 1] = max(DP[n - 1], sum);
		return;
	}

	if (DP[num] != 0 && DP[num] >= sum) return;

	DP[num] = sum;

	for (int i = num + 1; i < n; i++)
	{
		if (arr[num] < arr[i])
		{
			Go(i, sum + arr[i]);
		}
		else
		{
			Go(i, arr[i]);
		}
	}
}

int main()
{
	// 입력
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		int temp = 0;
		cin >> temp;

		arr[i] = temp;
	}

	Go(0, arr[0]);

	int mx = -1;

	for (int i = 0; i < n; i++)
	{
		mx = max(DP[i], mx);
	}

	cout << mx;
}
728x90
반응형
저작자표시 비영리 변경금지

'코딩테스트 > 백준 (Study)' 카테고리의 다른 글

[백준 / C++] 파티 (골드3, 1238)  (0) 2024.10.16
[백준 / C++] 최단경로 (골드4, 1753)  (0) 2024.10.14
[백준 / C++] 정수 삼각형(실버1, 1932)  (0) 2024.10.12
[백준 / C++] RGB거리(실버1, 1149)  (0) 2024.10.11
[백준 / C++] 1로 만들기(실버3, 1463)  (0) 2024.10.11
'코딩테스트/백준 (Study)' 카테고리의 다른 글
  • [백준 / C++] 파티 (골드3, 1238)
  • [백준 / C++] 최단경로 (골드4, 1753)
  • [백준 / C++] 정수 삼각형(실버1, 1932)
  • [백준 / C++] RGB거리(실버1, 1149)
리태s
리태s
게임 클라이언트 프로그래머 직무를 준비하며 공부한 내용을 정리한 블로그입니다.
    반응형
    250x250
  • 리태s
    LeeTaes 공부노트
    리태s
  • 전체
    오늘
    어제
    • Home (165)
      • 프로젝트 (20)
        • Isaac 3D (5)
        • TimelessAdventure (13)
        • FruitsPuzzle (2)
      • Game Programming (25)
        • C# (8)
        • Unity Engine (6)
        • Unreal Engine (8)
        • UE_Multiplayer (3)
      • 코딩테스트 (111)
        • 프로그래머스 (Lv. 0) (27)
        • 프로그래머스 (Lv. 1) (31)
        • 프로그래머스 (Lv. 2) (21)
        • 백준 (Study) (29)
        • 알고리즘 (3)
      • CS지식 (7)
        • 운영체제 (7)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    project t.a develop
    unrealengine
    후기
    c#
    Summer/Winter Coding
    pcce 기출문제
    sesac
    CS지식
    2019 kakao
    fsoftobjectpath
    청년취업사관학교
    코딩테스트
    구현
    2022 kakao
    timelessadventure
    Algorithm
    ai controller
    fruitspuzzle
    delegate
    dataasset
    Unreal Engine
    프로그래머스
    2018 kakao
    tsoftobjectptr
    C++
    issac3d
    unity
    프로젝트
    백준
    프로세스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
리태s
[백준 / C++] 가장 큰 증가하는 부분 수열 (실버2, 11055)
상단으로

티스토리툴바