문제링크 : https://www.acmicpc.net/problem/17216
17216번: 가장 큰 감소 부분 수열
수열 A가 주어졌을 때, 그 수열의 감소 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 8, 7, 3, 6, 5} 인 경우에 합이 가장 큰 감소 부분 수열
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int N, arr[1001], dp[1001];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for(int i=0; i<N; i++)
{
cin >> arr[i];
dp[i]=arr[i]; //최솟값 (초기값)
}
for(int i=0; i<N; i++)
{
for(int j=0; j<i; j++)
{
if(arr[i] < arr[j]) dp[i] = max(dp[i], dp[j]+arr[i]); //갱신
}
}
int result = 0;
for(int i=0; i<N; i++) result = max(result, dp[i]); //최대값 저장
cout << result;
return 0;
}
가장 큰 감소 부분 수열은 최솟값으로 자기 자신의 값을 가진다.
따라서 arr[i]의 값을 입력받는 동시에 dp[i]에 값을 저장해준다.
이후 2중 반복문을 통해 현재 i 기준 앞에 있는 값들을 체크한다.
현재 i보다 작다면 누적해야 더해주며 dp를 갱신하고 dp 값에 수열의 합이 담겼으니 최대값을 출력해주면 된다.
'백준 > 실버' 카테고리의 다른 글
[백준 1072번] 게임 (C++) (0) | 2024.02.26 |
---|---|
[백준 22857번] 가장 긴 짝수 연속한 부분 수열 (small) (C++) (0) | 2024.02.23 |
[백준 25214번] 크림 파스타 (C++) (0) | 2024.02.21 |
[백준 12101번] 1, 2, 3 더하기 2 (C++) (0) | 2024.02.20 |
[백준 15993번] 1, 2, 3 더하기 8 (C++) (0) | 2024.02.19 |