문제 85번 질문드립니다
322
2 asked
#include<iostream>
using namespace std;
int T[16];
int P[16];
int D[16];
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
//freopen("input.txt", "r", stdin);
int N;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> T[i] >> P[i];
}
for (int i = N - 1; i >= 0; i--) {
if (i + T[i] > N) D[i] = 0;
else {
D[i] = max(D[i + 1], P[i] + D[i + T[i]]);
}
}
cout << D[0];
}
여기서 초기화할 때 왜 0으로 하면 14프로까지 갔다가 틀렸습니다가 나오는지 잘 모르겠습니다
'i + T[i] > N' 다음 조건이 성립하면 항상 점화식의 값이 0이 나오는 것이 아닌가요?
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다.
문의하신 코드에 대해 확인해 보았습니다.
‘i + T[i] > N’ 조건이 성립하면 해당 일(day i)에 상담을 시작할 수 없는 상태이므로 D[i]를 0으로 설정하는 것은 맞습니다. 하지만 알고리즘 상 D[i]는 i번째 날부터 마지막 날까지 얻을 수 있는 최대 수익을 저장해야 합니다. 이 말은, 즉 ‘상담을 시작할 수 없으면 비록 해당 날의 상담을 할 수 없다고 하더라도, 그 이후 날짜에는 상담을 할 수 있을 수 있으므로, 그 이후 날짜의 최대 수익은 고려되어야 함’을 의미합니다.
따라서, ‘i + T[i] > N‘일 때 단순히 D[i]를 0으로 설정하는 것이 아니라 이전에 계산했던 D[i+1]의 값, 즉 ‘i+1’ 번째 날부터 마지막 날까지 얻을 수 있는 최대 수익을 D[i]에 저장해야 합니다. 만약 0으로 초기화할 경우, 그 이전 날짜의 수익을 고려하지 않게 되므로 올바른 결과를 도출할 수 없습니다.
따라서, 코드에서 ‘
if (i + T[i] > N) D[i] = 0;
이 부분을
if (i + T[i] > N) D[i] = D[i + 1];
로 수정해야 합니다. D[i + 1]은 i+1 날짜부터 계산된 최대 수익 값입니다. 이렇게 변경하면 i번째 날에 상담을 할 수 없다면 i+1번째 날부터의 최대 수익을 D[i]에 저장하게 됩니다.
변경 후 코드는 다음과 같습니다.
for (int i = N - 1; i >= 0; i--) {
if (i + T[i] > N) D[i] = D[i + 1];
else {
D[i] = max(D[i + 1], P[i] + D[i + T[i]]);
}
}
이렇게 수정하면, 상담을 시작할 수 없는 날짜에 대해서도 이후 날짜의 최대 수익을 고려하여 최종적으로 최대 수익을 얻을 수 있을 것입니다.
수강평 이벤트
0
15
2
Reticle이 안나옵니다.
0
5
1
진행 방법 질문드립니다!
0
23
2
안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.
0
18
1
Singleton 관련 질문입니다.
1
27
2
갑자기 채점 사이트가 바뀌었어요
0
19
1
42. [세그먼트 트리 실전 문제] 구간 합 구하기3 (백준 2042)
0
64
1
10986번 질문 있습니다!
0
45
0
LCA 빠르게 찾기 - 트리의 높이에 따른 k값 질문
0
119
0
백준 1377 질문있습니다
0
218
1
백준 1722 교재 81 질문
0
330
1
백준11505, 교재 73번
0
282
1
백주 1456번
0
200
1
백준 1325, 교재 47번 문제 질문입니다.
0
358
1
백준 11404 플로이드 문제 질문있습니다.
0
260
1
백준 13023 질문있습니다.
0
204
1
문제 8번 질문드립니
0
305
1
백준 1876여행 유니온 파인드 질문있습니다.
0
241
1
백준 2251 C++ 질문 있습니다.
0
398
2
퀵정렬 질문
3
291
1
i==k일떄 i++안해도되지않나요
0
436
1
알고리즘 코딩테스트 문제풀이 강의 - 14 절댓값 힙 구현하기 (백준 11286)
0
550
1
알고리즘 코딩테스트 문제풀이 강의 - 9 DNA 비밀번호 (백준 12891)
1
573
1
C++은 실전문제에 대한 강의가 없나요? 자바나 파이썬은 있는데 없는거 같아서요.
2
591
2

