[알고리즘]Dynamic Programming 알고리즘 작성하는거 좀 도와주십시오...

kik9459의 이미지

안녕하세요...

컴퓨터공학과 한 학생입니다...

알고리즘 과제를 받았는데 도저히 해결을 못하겠어서 조언이라도 얻으려고 이렇게 글을 올려봅니다..

각 cell은 맛의 정도를 표시한 -10 - 10 사이의 정수로 표시되어 있다. 여러분은 각 세로 줄의 한 부분을 잘라서 그 아랫부분을 모두 가져갈 수 있다. 이 작업은 가장 왼쪽 줄부터 오른쪽 줄로 한 칸씩 옮겨 가면서 하는데, 한 가지 주의할 것은 오른쪽 줄에서 잘린 높이는 왼쪽 줄의 높이보다 같거나 그 이상 이여야 한다.

5 8 2 4 -4 4
4 2 3 -3 -1 -6
2 -1 -7 6 -3 -8
-3 2 -8 -8 2 2
1 -5 3 9 3 -2

A B C D E F

위는 6줄 피자이다. 만일 A줄에서 밑에서부터 1+(-3)+2로 이루어진 3칸을 잘라서 가져갔다고 한다면 그 다음 B줄에서는 -5,2,1 을 잘라가거나 -5,2,1,7을 가져가거나 또는 모두 다인 -5,2,1,7,8을 가져가야 한다. 그 다음 C줄도 마찬 가지 규칙으로 가져가야 한다. 따라서 앞줄에서 욕심쟁이 마음으로 자르면 뒷줄에서 아주 손해를 볼 수 있다. 문제는 이렇게 했을 때 가장 맛있게 먹을 수 있는 방법을 (a) Dynamic Programming으로 구하는 알고리즘을 제시하고, (b) 위 그림에서 그 최대값을 계산하시오.

제가 지금까지 생각한 결과로는 F열부터 최대값을 구한 이후에 역순으로 최대값을 찾아나가는 방법을 시도해보고있었습니다..
하지만 경우의 수도 너무 많고 무식한 방법같아.. 조언 좀 해주시면 감사하겠습니다...

raymundo의 이미지

접근은 제대로 하신 것 같은데요.

저 테이블을 V(col, h)이라고 하고,
어떤 열에서 높이 h만큼(h는 1~5) 뜯어냈을 때, 최종적으로 얻을 수 있는 최댓값 MAX(col, h)는

col이 6인 경우 : MAX(6, h) = V(6,1) + ... + V(6,h)
(첫 줄부터 더한 값)
 
  F
 
-12
-14
 -8
  0
 -2

col이 5 ~ 1인 경우 :
MAX(col, h) = ( V(col,1)+ ... + V(col,h) ) + maximum( MAX(col+1,h), ... , MAX(col+1,5) )
(col열의 첫줄부터 더한 값 + 그 다음 열의 h줄 이상에서 얻을 수 있는 최댓값)
 
예를 들어 E열의 경우를 보면
- 한줄(3)만 뜯어내었다면 F열에서 두 줄을 뜯어 3+0을 만들 수 있음
- 두줄(3+2)을 뜯어내었다면 역시 F열에서 두 줄을 뜯어 5+0을 만들 수 있음
- 세줄(3+2-3)을 뜯어내었다면 F열에서 세 줄을 뜯어 2-8을 만드는 게 최선
...
 
  E   F
-15 -12
-11 -14
 -6  -8
  5   0
  3  -2

이런 식으로 col=1 까지 계산하고 나면

 A
 
 1
-4
-8
-4
13

MAX(1, h)는 위와 같이 나오고, A열에서 1줄만 뜯었을 때 13을 얻는 게 최댓값이네요.
1 + (-5) + 3 + 9 + (3+2) + (-2+2) = 13

- 제가 종이에 적어서 암산한 거라 산수에 실수가 있었을 수는 있습니다.

- 매번 1~h줄의 sum(V)을 구하는 것과 h~5의 maximum(MAX)을 구하기 위해 루프를 도는 게 불만이면... sum과 maximum의 테이블을 따로 만들어도 되겠고요.

좋은 하루 되세요!

kik9459의 이미지

답변 너무 감사합니다...! 제 접근 방법에 대해 더 확신을 갖게됬습니다!!! raymundo님 또한 좋은 하루 보내십시오!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.