[수업]Card Game

Intro..

이 문제는 NIM게임 관련 문제이다.

결국 DP같은 형태로 풀게 될 것이다.

DP, NIM 관련해서 정리해둔 게시글이 있기 때문에 참고할 것.


문제

screen captures

screen captures


풀이

문제의 의미는 양끝에서만 카드를 집어갈 수 있는 조건이며, 마지막에 총합해서 젤 높은 숫자를 뽑은 사람이 승자 게임.

2차원 배열 => 재귀 + DP형태로 풀었음(top-bottom)

교수님 풀이는 bottom-top 방식!! => 추천

left, right로 양쪽 끝을 index..

앨리스가 먼저 시작하게끔 알고리즘 구성

=> left+1과 right-1 양쪽 끝 접근형태로 앨리스 먼저 시작하게 코드.

COMPUTER는 단순히 양쪽끝에서 MAX값을 가져가게끔.(먼저시작하거나 하질 않으니 이것만 생각)

앨리스는 먼저 시작이니 left or right 값을 먼저 + 해주고, COMPUTER가 기록한 값들중 MIN값을 더해줘야 앨리스가 더 숫자 높은 상태가 됨.(COM이 MIN이야 앨리스가 당근 더 높으니까)

중복 계산 차단은 COMPUTER때 if!=0으로!(dp배열 사용)

2차원 배열이 아래 형태로 그려져가며, 대각선으로 채워져 나감.(따라서 위의 규칙만 잘 지키면 bottom-up 방식으로 더 간단히 풀 수도 있을것임. 예로 앨리스면 하위 양끝중 MIN값택, 컴퓨터면 하위 양끝중 MAX값택 형태로 채워나가면 될것임)

screen captures

=> 파란선을 따라가보면 대각선먼저 쌓여가는 재귀 형태란점을 볼 수 있음

screen captures

=> 4x4로 손으로 풀어본 것

교수님 풀이 - card game

데이터 : 2 5 100 3 7 6 => 데이터 : x x x i … j x x x

2차원배열 curr, next 2개 이용해서 대각선방향으로 구해감

dp배열을 curr(i,j) 라 하면, curr(1,n)을 구하는게 목표(1…n사이 최대합을 의미)

  • curr(i,j)는?
    • i…j사이 최대합을 의미
  • dp배열을 하나더 사용 - next(i+1,j)
    • 다음 차례(상대방)의 i+1…j사이 최대합 의미
  • Sum(i)는 i까지의 누적합( 이것도 필요함 )
  • card(i)는 i번째 카드 값

img

  • i는 행, j는 열이겠지만. i,2,3,4,…j(n) 이런식으로 card 순번으로도 유동적으로 생각해줄것

1,2번째 for문은 당연한 기본 초기값 세팅

  • curr[i][i]는 i..i니까 card[i]번째 값인게 자명
  • next[i][i]는 curr이 이미 i..i를 가져갔으므로 0인게 자명

if (j-i)==1, curr(i,j) = max(card(i), card(j))

  • j-i==1이면 i와 j차이가 1이니까 i다음 j인것.
  • 그럼 당연히 i번 카드와 j번 카드중 큰값을 curr에 반영해야 이김

  • 이방식을 활용하자는것!! 아래식 도출 가능

curr(i,j)=max(card(i)+next(i+1,j), card(j)+next(i,j-1))

  • 그다음 next구하는것은?? 아래식!

Sum(j)-sum(i-1)-curr(i,j)

  • Sum(j)-sum(i-1)는 i…j까지 누적합을 의미.
  • 여기서 현재 i…j구한 최대합 curr(i,j)를 빼주면 다음 차례의 next(i,j)가 도출

댓글남기기