https://www.acmicpc.net/problem/14501
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
/******** 전역변수 ********/
int day[16];
int pay[16];
int maxpay[16];
/******** 함 수 ********/
int main(void) {
/******** C++ INIT ********/
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
/******** 지역변수 ********/
int input1;
int input2;
int input3;
int idx;
int max;
/******** 구 현 ********/
cin >> input1;
// 기간, 금액 배열에 삽입
for (int i = 1; i <= input1; i++) {
cin >> input2 >> input3;
day[i] = input2;
pay[i] = input3;
}
// 각 날짜에 받을 수 있는 최대 금액을 계산 (가장 뒤쪽 날짜부터)
for (int i = input1; i > 0; i--) {
// 현재 날짜 + 상담 기간이 퇴사일을 초과하면 그 날의 금액는 0원
if (i + day[i] > input1 + 1) maxpay[i] = 0;
// 현재 날짜 + 상담 기간이 퇴사일 이내일 때,
else {
// 1. 최대 금액을 해당 날의 금액으로 우선 저장
maxpay[i] = pay[i];
// 2. 그 날의 최대금액 + 상담 기간이 지난 후 한번 더 받을 수 있는 최대 금액 검색 후 저장
// 현재 날짜 + 상담 기간을 idx에 저장
idx = i + day[i];
max = 0;
// 상담기간이 지난 후 퇴사일 이내에 존재하는 최대 금액 검색
while (idx <= input1) {
if (max < maxpay[idx]) max = maxpay[idx];
idx++; // 하루씩 증가
}
// 3. 한번 더 받을 수 있는 금액을 다시 저장
maxpay[i] += max;
}
}
// 받을 수 있는 최대 금액를 출력
cout << *max_element(maxpay, maxpay + 16);
}
'알고리즘' 카테고리의 다른 글
C++ 알고리즘 - 2193 이친수 (0) | 2025.02.13 |
---|---|
C++ 알고리즘 - 1244 스위치 켜고 끄기 (0) | 2025.02.10 |
C++ 알고리즘 - 13305 주유소 (1) | 2025.02.10 |
C++ 알고리즘 - 17478 재귀함수가 뭔가요? (1) | 2025.02.10 |
C++ 알고리즘 - 2559 수열 (0) | 2025.01.28 |