博弈dp小结

Codeforces859C

C. Pie Rules

题意

有n个物品,每个物品有不同的价值,物品按顺序分给两个人,有一块令牌,每回合拥有令牌的人拥有物品的分配权,但是该回合未获得物品的那个人会在下回合获得令牌,开始令牌在Bob手里,两个人都采取最优的策略,问最后各能获得的最大价值是多少


分析

 这种题一看就是dp的套路,dp[i]:表示考虑位置i最佳决策,不难看出,位置i的确定需要(i+1~n)即位置i后面的状态,所以从后往前dp,转移就是:

不选这个数即直接继承dp[i+1]的最优决策, 还有一个是选择a[i] 即后缀和sum - dp[i+1] + a[i] ,dp[i] = max(dp[i+1], sum - dp[i+1] + a[i] ) 

最后dp[1]就是Bob的最大价值,sum - dp[1]就是Alice的

时间复杂度O(n)

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;

int dp[55];
int a[maxn];
int sum[maxn];


int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for(int i = n; i >= 1; i--)
    {
        sum[i] = sum[i+1] + a[i];
        dp[i] = max(dp[i+1], sum[i+1] - dp[i+1] + a[i]);
    }
    printf("%d %d
", sum[1]-dp[1], dp[1]);
    return 0;
}
View Code

Arc#085 Arc

D.ABS

题意

给n个数的序列,两个人玩游戏,初始X有Z元,Y有W元,X从前往后先选一个数,Y只能从X选的位置后面选,每个人一旦选了一个数就要把手上扔掉,最后的答案是abs(Z-W)(z,w都是最后的值),X希望答案越大越好,Y希望答案越小越好


分析

分析可以看出(猜)出答案,但属于dp可以解决的问题,坑一号


要么优秀要么生锈
原文地址:https://www.cnblogs.com/Superwalker/p/7828541.html