되면한다
백준11055. 가장 큰 증가하는 부분 수열 (DP) 본문
https://www.acmicpc.net/problem/11055
11055번: 가장 큰 증가하는 부분 수열
수열 A가 주어졌을 때, 그 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가하는
www.acmicpc.net
n<= 1000이므로 O(n^2)의 알고리즘을 짜면 해결할 수 있다.
dp 테이블인 d를 i를 포함하는 부분 집합의 최대합으로 설정한다. 때문에, d는 초기값을 들어온 값으로 설정할 수 있다.
(d의 최솟값은 현재 좌표만을 부분 집합으로 가질때이다.)
나는 이 테이블 정의하는 데에서 시간이 오래 걸렸다. (i 까지의 부분 집합의 최대합이라고 정의했기 때문)
아무튼 이렇게 테이블을 설정하고, 이중 for문을 돌면서 현재 좌표를 포함하는 부분 집합의 최댓값을 업데이트 해주면된다.
코드는 다음과 같다.
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <limits.h>
#include <algorithm>
using namespace std;
int n;
int arr[1002];
int d[1002]; // i를 포함하는 부분 집합의 최대합
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> arr[i];
d[i] = arr[i];
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < i; j++)
{
if(arr[i] > arr[j]) d[i] = max(d[j]+arr[i], d[i]);
}
}
cout << *max_element(d, d+n);
}
'코딩테스트준비 > 다시볼문제' 카테고리의 다른 글
백준 2240. 자두나무 (DP) (0) | 2023.07.12 |
---|---|
백준 14501. 퇴사 (DP) (0) | 2023.07.11 |
백준 1912. 연속합 (DP) (0) | 2023.07.10 |
백준 2579. 계단 오르기 (DP) (0) | 2023.07.09 |
프로그래머스. 가장 긴 팰린드롬 (구현) (0) | 2023.07.08 |
Comments