UVa 10891 - Game of Sum

传送门

UVa 10891 - Game of Sum

题意

两个人取数字,可以从头开始也可以从尾巴开始,连续,求两个人的最大差值。

参考了某处的解题报告。
虽然想到用$dp[i][j]$表示i到j第一个人得到的最大值,但是轮流取就不知道怎么处理了( TДT),所以得不出状态转移方程。
看了解题报告才知道可以把$dp[i][j]$表示成这个范围内能选择的最大数,这些区间可以当成是B能达到的最大值,然后取最小。。一入DP深似海,从此那啥成路人。

代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100 + 10;

int dp[MAXN][MAXN], sum[MAXN], vis[MAXN][MAXN];

int DFS(int l, int r)
{
    if (vis[l][r])
        return dp[l][r];
    vis[l][r] = 1;
    int temp = 0;
    for (int i = l; i < r; i++)
        temp = min(DFS(l, i), temp);
    for (int i = l + 1; i <= r; i++)
        temp = min(DFS(i, r), temp);
    return dp[l][r] = sum[r] - sum[l - 1] - temp;
}

int main()
{
    //freopen("input.txt", "r", stdin);
    int n, i, j;
    while (scanf("%d", &n), n)
    {
        //memset(vis, 0, sizeof vis);
        dp[0][0] = 0;
        for (i = 1; i <= n; i++)
        {
            scanf("%d", [i]);
            sum[i] += sum[i - 1];
            for (j = 1; j <= n; j++)
                vis[i][j] = 0;
        }
        printf("%d\n", 2 * DFS(1, n) - sum[n]);
    }
    return 0;
}

Powered by Jekyll and Theme by solid