思路:
dp
我们知道无论谁拿到decider token他拿不拿蛋糕都是确定的,都是使自己最优的结果。
于是
定义状态:dp[i]表示到第i个位置拿到decider token的人能使自己拿到的最大的值
初始状态:dp[n]=a[n]
目标状态:dp[1]
状态转移:dp[i]=max(dp[i+1],sum[i+1]-dp[i+1]+a[i])(sum[i]表示后缀和)
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) int a[55]; int dp[55]; int sum[55]; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=n;i>=1;i--){ sum[i]=sum[i+1]+a[i]; dp[i]=max(sum[i+1]-dp[i+1]+a[i],dp[i+1]); } cout<<sum[1]-dp[1]<<‘ ‘<<dp[1]<<endl; return 0; }