codeforces 859C

题目链接:https://codeforces.com/problemset/problem/859/C

对于当前拥有选择权的人,要么选择不拿当前的派,要么选择拿派并交换选择权,
那么当前的人所做出的决策,一定是根据后续状态的情况,选择当前收益最大的情况(博弈性)
(dp[i])表示当前拥有选择权的人的最大收益,从后向前转移

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;

const int maxn = 100;

int n;
int a[maxn],sum[maxn],dp[maxn];

ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }

int main(){
	n = read();
	for(int i=1;i<=n;++i){
		a[i] = read(), sum[i] = sum[i-1] + a[i];
	} 
	
	dp[n] = a[n];
	for(int i=n-1;i>=1;--i){
		dp[i] = max(dp[i+1],sum[n] - sum[i] - dp[i+1] + a[i]);
	} 
	
	printf("%d %d
",sum[n]-dp[1],dp[1]);
	
	return 0;
}
原文地址:https://www.cnblogs.com/tuchen/p/13838039.html