CF – gym – 101502 – J. Boxes Game(博弈dp + 记忆化搜索 + 思维)

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;
}

你可能感兴趣的:(动态规划,思维)