博弈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\n", sum[1]-dp[1], dp[1]); return 0; }
Arc#085 Arc
D.ABS
题意
给n个数的序列,两个人玩游戏,初始X有Z元,Y有W元,X从前往后先选一个数,Y只能从X选的位置后面选,每个人一旦选了一个数就要把手上扔掉,最后的答案是abs(Z-W)(z,w都是最后的值),X希望答案越大越好,Y希望答案越小越好
分析
分析可以看出(猜)出答案,但属于dp可以解决的问题,坑一号
要么优秀要么生锈