package com.interview.books.geeksforgeeks;
import com.interview.utils.ConsoleWriter;
/**
* Created_By: stefanie
* Date: 15-1-8
* Time: 下午2:47
*/
public class GFG1_CoinsInLine {
// money[i][j] = the max money I can get in the coin sequence num[i] ~ num[j]
// initialize:
// money[i][i] = coins[i];
// money[i][i+1] == max(coins[i], coins[i+1]);
// function: money[i][j] = max of
// num[i] + min(money[i+2][j], money[i+1][j-1])
// num[j] + min(money[i+1][j-1], money[i][j-2])
// same as palindrome, need loop on len and start point
// result: money[0][num.length-1]
public int[][] max(int[] coins){
int[][] money = new int[coins.length][coins.length];
for(int i = 0; i+1 < coins.length; i++){
money[i][i] = coins[i];
money[i][i+1] = Math.max(coins[i], coins[i+1]);
}
for(int len = 2; len < coins.length; len++){
for(int i = 0; i + len < coins.length; i++){
int j = i + len;
money[i][j] = Math.max(
coins[i] + Math.min(money[i+2][j], money[i+1][j-1]),
coins[j] + Math.min(money[i+1][j-1], money[i][j-2])
);
}
}
//return money[0][coins.length - 1];
return turns(money, coins);
}
public int[][] turns(int[][] money, int[] coins){
int[] first = new int[coins.length/2];
int[] second = new int[coins.length/2];
int front = 0;
int back = coins.length - 1;
int[] current = first;
int turn = 0;
while(front < back){
if(money[front + 1][back] < money[front][back - 1]){
current[turn/2] = coins[front];
front++;
} else {
current[turn/2] = coins[back];
back--;
}
turn++;
current = current == first? second : first;
}
current[turn/2] = coins[front];
return new int[][]{first, second};
}
public static void main(String[] args){
GFG1_CoinsInLine game = new GFG1_CoinsInLine();
int[] coins = new int[]{5, 3, 7, 10};
//System.out.println(game.max(coins));//15
int[][] turns = game.max(coins);
for(int i = 0; i < turns.length; i++)
ConsoleWriter.printIntArray(turns[i]);
coins = new int[]{8, 15, 3, 7};
//System.out.println(game.max(coins));//22
turns = game.max(coins);
for(int i = 0; i < turns.length; i++)
ConsoleWriter.printIntArray(turns[i]);
}
}