7
1
10
1
10
1
10
1
이면 32를 출력해야 하는데 (1, 10, 10, 10, 1) 23을 출력하네요(1, 10, 10, 1, 1?)
아직 자세히 보지는 않아서 논리 자체의 문제인지 코드 상의 오류인지는 잘 모르겠네요.
2156번 - 포도주 시식
7
1
10
1
10
1
10
1
이면 32를 출력해야 하는데 (1, 10, 10, 10, 1) 23을 출력하네요(1, 10, 10, 1, 1?)
아직 자세히 보지는 않아서 논리 자체의 문제인지 코드 상의 오류인지는 잘 모르겠네요.
count 가 꽉 차지 않았으면 무조건 더하도록 하셔서 그런 것 같네요
위의 예시에서 보면 1, 10, (1), 10, 1, (10) (괄호안은 건너뛰었다는 의미)이 되어버리는데 사실은 1, 10, (1), 10, (1), 10
이 되어야 최대값에 도달할 수 있을 것 같네요
음 dp에 익숙치 않다고 하셨으니 우선 일반적인 풀이법에 대해서 설명드릴게요.
f(pos)를 pos까지 왔을 때, 최대로 마실 수 있는 와인의 양이라고 하겠습니다. (꼭 pos의 와인을 마실 필요는 없음.) (이 f함수가 어떻게 이 값을 구하는 지는 모르겠으나 마술같이 잘 구해준다고 합시다.)
그럼 이제 효주가 n의 위치에 있을 때 마실 수 있는 와인의 최대양을 알아보겠습니다.
n-3, n-2, n-1, n 위치가 이렇게 있다고 하면,
효주는 f(n-3) (: n-3까지 왔을 때의 최대값) + n-1 + n의 와인을 마시거나, (f(n-3)이 n-4, n-3을 마신 후의 최대값일 수도 있으니 n-2는 마실수가없죠)
f(n-2) + n의 와인을 마시거나
f(n-1)까지 마시고 n은 안 마실수도 있죠.
그럼 n까지의 최대값은 max( f(n-3) + wine[n-1] + wine[n], f(n-2) + wine[n], f(n-1) )이 됩니다.
근데 f의 정의가 pos까지의 최대값이라고 하였으니, f(n) = max( f(n-3) + wine[n-1] + wine[n], f(n-2) + wine[n], f(n-1) ) 꼴의 점화식이 됩니다.
(물론 f(0) = 0, f(1) = wine[1], f(2)= wine[1]+wine[2] 처럼 적절한 초기조건이 있어야 겠죠)
이 함수는 답을 아주 잘 구해줍니다.
다만, f(10)을 구한다고 할 경우, f(7), f(8), f(9)를 구해야 하는데 f(9)를 구하기 위해서는 f(6), f(7), f(8) (두 개나 겹치네요)를 구해야 합니다.
그래서 이 때 dp가 필요한 것 입니다.
별 게 아니라, 별도의 테이블에 f(k)의 값을 적어두고, f(n)를 계산하기에 앞서서 f(n)이 테이블에 있다면 (tbl[n] != -1) 계산하지 않고 tbl[n]을 반환하고, 계산결과가 없다면 f(n)의 결과값을 tbl[n]에 기록한 다음, tbl[n]을 반환하면 됩니다.
물론 위와 같은 재귀적 풀이는 함수호출 때문에 조금 느릴 수도 있고, 메모리가 부족할 수 도 있습니다.
그때는 tbl[pos]를 pos까지 왔을 때, 최대로 마실 수 있는 와인의 양이라고 하고 tbl[n] = max ( tbl[n-3]....)처럼 식을 세우고,
포문으로 i = 0부터 시작해서 tbl[i]를 채워나간다면 됩니다.
1 2 3 더하기라는 문제가 위의 재귀적 방식으로 풀기 괜찮은 dp문제이니 (사실 이 문제는 범위가 작아서 11까지 밖에 없어서 dp없이도 풀 수 있었던 것 같습니다.) 한 번 풀어보시는 걸 추천드립니다.
새해 복 많이 받으세요 ~
댓글을 작성하려면 로그인해야 합니다.
dmsgh7678 8년 전
이거 왠지 DP를 만들어서 하는 문제 같으나 저는 이것을 잘몰라 저만의 방식대로 풀었습니다.
일단 sum1,sum2,sum3을 만들어서 예제의 경우 6개의 잔이 6 10 13 9 8 1 이렇게 있다고 할때
처음 3개로 sum1,sum2,sum3을 정합니다. sum1=6+10 sum2=6+13 sum3=10+13 그리고 4번째 잔에서 sum의 길이 즉 count를 보면 count1= 0 count2=1 count=2 n번째 잔에서 길이가 2일경우 안더하는 식으로 해서 모든 경우의 수를 구하는 식으로 구해보았는데요.. 어디가
틀렸는지 모르겠습니다.ㅠㅠ 도와주세요..흑흑