lch32111   3년 전

아래의 소스코드에 명시했듯이, 

dp[i]를 i index에서 시작하여 연속할 수 있는 최대값이라고 설정했습니다. 이 때, dp[i]의 값은 그 연속하는 수열에서 

한 숫자를 제외할 수도 안할수도 있습니다.

그리고 minv[i]를 dp[i]를 구하기 위해서 그 제외한 숫자를 저장하기로 했습니다. 제외하지 않았다면 0으로 설정합니다.

먼저 입력을 다 받아놓고, 배열의 맨 뒤에서부터 dp를 검색합니다.

왜냐하면 dp[i+1] + v[i]의 값이 v[i]보다 더 크다면, 그 연속합 dp[i+1]에 v[i]를 추가하여

i의 인덱스도 연속하는 것의 범위에 포함할 수 있기 때문입니다.


이 때, v[i]가 minv[i]보다 작으면, 이전에 제외했던 값을 다시 살리고, 그 더 작은 값을 빼주어서

더 최적화된 dp[i]의 값을 구해줍니다.


이렇게 0번의 인덱스까지 돌면서 max dp값을 구해주고 출력합니다.


테스트 케이스 대부분을 돌리면서 통과하는 것을 확인했는데 3%에서 바로 틀려버리네요.

이 점화식에 어떤 문제가 있을까요?

hus5522   3년 전

반례는 

10
2 1 -4 3 4 -4 6 5 -5 1

입니다.

출력 : 15 (가장 작은 -5를 제외했을 때, 3 4 -4 6 5 1 을 더하여 최대값 15)

정답 : 18 (6번째 수 -4 를 제외했을 때, 3 4 6 5 를 더하여 최대값 18)

모든 수를 한번씩 제외하는 경우를 따로따로 살펴봐야 하는데, 위 반례에서는 그렇지 않습니다.

위의 코드는 결과적으로 수열중에 가장 작은 수를 제외하는 수로 지정하며, 지정된 수를 제외한 합의 최대값을 구하고 있는 것으로 보여지네요.

댓글을 작성하려면 로그인해야 합니다.