http://codeforces.com/gym/101502/problem/J
dfs居然两行就能写完?恐怖。
定义dfs(l, r)返回区间[l, r]的答案, 先看第一次调用这个函数,这个函数返回max(a[l] – dfs(l + 1, r), a[r] – dfs(l, r – 1)),逗号前面是选择左端点,选择左端点之后dfs(l + 1, r)就是区间[l + 1, r]的答案,由于是x – y,所以第一个人先手选择左端点或右端点,后手取剩余区间最大值,两者相减,取其最大值,之后两个人交换,后手变先手,后手进入dfs(l + 1, r)变先手,于是可以递归求解。
int dfs(int l,int r)
{
if(dp[l][r] || l == r) return dp[l][r];
return dp[l][r] = max(a[l] - dfs(l + 1, r), a[r] - dfs(l, r - 1));
}
int main()
{
int t;
t = in();
while (t--){
int n;
n = in();
for (int i = 1; i <= n; ++i) dp[i][i] = a[i] = in();
outn(dfs(1, n));
memset(dp, 0, sizeof(dp));
}
return 0;
}