leetcode 877 돌 게임

주제 설명 :

알렉스 리는 게임에 몇 돌 힙. 로우 스택 돌 짝수 각 스택은 [I] 양수 돌 조각 더미있다.

누가 승자를 결정하는 가장 돌 게임을 있어요. 돌의 총 수는 어떠한 연신이 존재하지 홀수이다.

알렉스 리는 번갈아 가며, 알렉스 먼저 시작합니다. 각 턴 플레이어는 라인의 시작이나 끝에서 돌의 전체 더미를 빼앗아. 이러한 상황은있는 돌 승리의 손의 대부분을 지적, 더 이상 돌 더미 때까지 계속했다.

알렉스 리 가정 및 최고 수준의 플레이는 알렉스가 게임을 승리하는 경우, true를 돌려 리는 게임을 승리 할 때 false를 반환합니다.

 

예 :

입력 : [5,3,4,5]
출력 : 사실
설명 :
알렉스 먼저 시작, 5, 5 후 돌을하기 전에.
그는 5 전에했다 가정,이 라인은 [3,4,5]이된다.
리는 세 가지를 데려 가기 전에, 그 나머지는 [4,5] 인 경우, 알렉스 10 분 후 5 승리했다.
5 [3,4], 알렉스 9 분 4 승을했다 리 멀리하고 나머지는됩니다.
이 전 알렉스는 이동의 승리 다섯 돌을 제안, 그래서 우리는 true를 돌려줍니다.

 

아이디어의 분석 :

게임 문제입니다. 양측은 스마트 충분한 사람들, 그래서 욕심의 직접 사용은 허용하지 않기 때문에.

우리는 동적 솔버를 사용합니다. DP [I] [J]를 [0], i 번째의 제 j 적층 스택에 돌은 단지 돌의 최대 개수를 얻을 경우가 나타내는. DP [I] [J]를 [1] 플립을 나타낸다. 상태 전이 방정식, DP들은 [I] [J] [0] = 최대 (더미 [I] + DP [I + 1] [J] [1], 더미 [J] + DP [I] [J-1] [1]), 헤드 손 좌단, DP를 선택 [I]는 [j]가 [1] DP를 = I + 1] [J] [0], 헤드 손 우단, DP를 선택 [I] [J] [1] = DP [I] [J-1] [0]. 여기 우세 하프 따라서 업데이트가 교대로인가되는 상대적이다.

 

코드 :

급 솔루션 { 
공개 : 
    부울 stoneGame (벡터 <INT> 및 더미) { 
        INT N = piles.size (); 
        INT DP [N] [N] [2] = {0}; 
        경우 (; 나는 <N; I = 0 int로 난 ++) 
        { 
            DP를 [I] [I] [0] = 더미 [I]; 
            DP는 [I] [I] [1] = 0; 
        } 
        에 대해 (INT의 L = 1, L, N <; L ++) 
        { 
            위해 (나는 N 개의 L <+] I = 0 int로 난 ++) 
            { 
                INT J = L + 난; 
                INT는 더미 = [I] + DP 남아 [I + 1] [J] [1]; 
                오른쪽 = 더미 [J] + DP에서 INT [I] [J-1] [1]; 
                (왼쪽> 오른쪽) 경우에 
                { 
                    DP [I] [J] [0] = 왼쪽;
                    DP는 [내가] [j]가 [1]을 DP = I + 1] [J] [0]; 
                } 
                다른 
                { 
                    DP는 [I] [J]를 [0] = 오른쪽; 
                    DP는 [I] [J]를 [1] = DP [I] [J-1] [0]; 
                } 
            } 
        } 
        리턴 DP [0] [N-1] [0] -dp [0] [N-1] [1]> 0; 
    } 
};

 

추천

출처www.cnblogs.com/LJ-LJ/p/11365415.html