题意: 点击打开链接
有n个物品,每个物品有不同的价值,物品按顺序分给两个人,有一块令牌,每回合拥有令牌的人拥有物品的分配权,但是该回合未获得物品的那个人会在下回合获得令牌,开始令牌在Bob手里,两个人都采取最优的策略,问最后各能获得的最大价值是多少。
思路:dp
考虑决策在谁手上, 也就是做出最佳决策(当前的最佳决策时由后面的状态决定), 所以要从尾端开始记忆化,
定义状态:dp【i】: 当前决策在谁手上, 他的最优选择
转移:dp【i】 : 看代码、
#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;
}