Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 조합
- 완전 탐색
- 링크드리스트
- 분할 정복
- lis
- 우선순위 큐
- 빠른 입출력
- 중복 순열
- SSAFY
- DP
- 순열
- 크루스칼
- Knapsack
- 비트마스크
- BFS
- BeautifulSoup
- 재귀
- 세그먼트 트리
- 큐
- 메모리풀
- 피보나치 수
- 스택
- dfs
- 이분 탐색
- 클래스
- 시뮬레이션
- 백트래킹
- 문자열
- 그리디
- MST
Archives
- Today
- Total
작심 24/7
[백준] 14501번 퇴사 본문
14501번: 퇴사
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
www.acmicpc.net
완전 탐색, DP 두 가지 방법으로 풀 수 있다.
완전 탐색은 1일부터 차근차근 가능한 날을 모두 골라 최댓값을 구해주면 되고
DP는
i 일에 얻는 이익 = max(i 일을 선택할 때 얻는 최대 이익, i 일을 선택하지 않을 때 얻는 최대 이익)
→ i 일에 얻는 이익 = max(i 일을 선택할 때 얻는 이익 + i+T[i]일에 얻는 최대 이익, i+1일에 얻는 최대 이익)
→ DP[i] = max(P[i] + DP[i + T[i]], DP[i + 1])
라는 점화식을 세워주고 재귀로 구현하면 된다.
1. 완전 탐색
#include <iostream>
#include <algorithm>
using namespace std;
int N, Max;
int T[16], P[16];
void BruteForce(int idx, int res) {
if (idx > N) Max = max(Max, res);
else {
for (int i = idx; i <= N; i++) {
if (i + T[i] > N + 1) BruteForce(i + T[i], res);
else BruteForce(i + T[i], res + P[i]);
}
}
}
int main() {
cin >> N;
for (int n = 1; n <= N; n++) cin >> T[n] >> P[n];
BruteForce(1, 0);
cout << Max;
return 0;
}
2. DP
#include <iostream>
#include <algorithm>
using namespace std;
int N;
int T[16], P[16];
int DP(int idx) {
if (idx > N) return 0;
if (idx + T[idx] > N + 1) return max(DP(idx + T[idx]), DP(idx + 1));
else return max(P[idx] + DP(idx + T[idx]), DP(idx + 1));
}
int main() {
cin >> N;
for (int n = 1; n <= N; n++) cin >> T[n] >> P[n];
cout << DP(1);
return 0;
}
'백준' 카테고리의 다른 글
[백준] 13460번 구슬 탈출 2 (C++) - 1 (0) | 2020.07.13 |
---|---|
[백준] 17472번 다리 만들기 2 (C++, JAVA) (0) | 2020.07.07 |
[백준] 17471번 게리맨더링 (0) | 2020.07.07 |
[백준] 14500번 테트로미노 (1) | 2020.07.06 |
[백준] 1103번 게임 (0) | 2020.07.06 |
Comments