第一行:N
第2至N+1行:每行一个数,代表糖果数
一个数,请输出胜利者比失败者多拿多少糖果
4 1 55 41 2
15
小明先选择55,此时环从55处断开,变为序列[41, 2, 1]
小红选择行首的41,此时剩余的序列为[2, 1]
小明选择行首的2,此时剩余的序列为[1]
小红选择剩余的1。
此时小明胜利,比小红多15个糖果
import java.util.*;
// 环:复制一倍结尾, 枚举分割点, 取max
// DP[i][j]表示candy[i~j]中先手比后手多拿的糖果数
// 区间DP
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] candy = new int[n << 1];
for (int i = 0; i < n; i++) {
candy[i] = candy[i + n] = in.nextInt();
}
memo = new int[n << 1][n << 1];
for (int[] row : memo) Arrays.fill(row, -1);
int res = 0;
for (int i = 0; i < n; i++) { // [i, i+n-1]
res = Math.max(res, dfs(candy, i, i + n - 1)); // 最大
}
System.out.println(res);
}
static int[][] memo;
static int dfs(int[] candy, int i, int j) {
if (i == j) return candy[i];
if (memo[i][j] != -1) return memo[i][j];
return memo[i][j] = Math.max(candy[i] - dfs(candy, i + 1, j), candy[j] - dfs(candy, i, j - 1));
}
}