题目连接:跳转到网站
题目大意:有 n 个物品,每个物品有不同的价值,物品按顺序分给两个人,有一块令牌,每回合拥有令牌的人拥有物品的分配权,但是该回合未获得物品的那个人会在下回合获得令牌,开始令牌在Bob手里,两个人都采取最优的策略,问最后各能获得的最大价值是多少。
解题思路:因为数据范围给的n<=50,(要是给1e3的话 就比较好看出是个dp了)就是开一个dp[i]记录到第i个为止,当前持有令牌的人所得到的最大权值,从n逆序遍历(因为我们只知道初始时Bob拿着令牌,所以我们可以倒着转移状态 ,Bob: dp[1] , Alice: sum[1]-dp[1]):
如果当前持有令牌的人不要这个物品,那么dp[i]=dp[i+1] (权值不增加)
要的话:dp[i]=sum[i+1]+w[i]-dp[i+1] (后缀和减去上一个人的权值)
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=200007;
int w[55],sum[55],dp[55];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=n;i>=1;i--){
sum[i]=sum[i+1]+w[i];
dp[i]=max(dp[i+1],sum[i]-dp[i+1]);
}
printf("%d %d",sum[1]-dp[1],dp[1]);
return 0;
}