可以知道整体石子的总和一定的,所以一个人的得分越高,另一个人的得分就越低。不管怎么取任意时刻游戏的状态都是原始序列的一段连续子序列(即被玩家取剩下的序列)。
因此,用d(i,j)表示玩家A在i到j部分的最大和,在双方都采取最优策略的情况下,先手得分最大值。
d[i][j] = sum[i][j] - min(dp(i + k, j), dp(i, j - k)); (1 <= k <= j - i + 1)
#include#include #include #include using namespace std;int S[105], A[105], d[105][105], vis[105][105], n;int dp(int i, int j) { if (vis[i][j]) return d[i][j]; vis[i][j] = 1; int m = 0; for (int k=i+1;k<=j;k++) { m=min(m,dp(k,j)); } for(int k=i;k