• [CF859C] Pie Rules


    有一个长度为n的序列,Alice和Bob在玩游戏。Bob先手掌握决策权。

    他们从左向右扫整个序列,在任意时刻,拥有决策权的人有如下两个选择:

    • 将当前的数加到自己的得分中,并将决策权给对方,对方将获得下一个数的决策权

    • 将当前的数加到对方的得分中,并将决策权保留给自己,自己将获得下一个数的决策权

    假定他们都使用最优策略,求他们最后分别能获得多少分

    Solution

    考虑到无后效性,令 (f[i][0/1]) 表示 0/1 处理完了前 (i) 个数,先手和后手得分的差

    转移即枚举上一次的位置

    (f[i][1]=max(f[j][0] - a[j+1] - a[j+2] - ... +a[i]))

    (f[i][0]=min(f[j][1] + a[j+1] + a[j+2] + ... -a[i]))

    换个思路,记 (f[i]) 为从 (i) 开始往后选,能获得的最大收益,我们可以来决策每个位置是否翻面

    (f[i]=max(f[i+1], s[i]-f[i+1]))

    其中 (s[i]) 是后缀和

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 105;
    int n,f[N],s[N],a[N];
    
    int main() {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=n;i;--i) s[i]=s[i+1]+a[i];
        for(int i=n;i;--i) f[i]=max(f[i+1],s[i]-f[i+1]);
        cout<<s[1]-f[1]<<" "<<f[1];
    }
    
  • 相关阅读:
    关于进程间通信
    ipc (进程间通信
    为什么需要进程间通信??
    重载、重写、覆盖
    conerstone代码回滚
    重载、重写、符号冲突、扩展
    UICollectionView(一)基本概念
    UICollectionViewFlowLayout & UICollectionViewDelegateFlowLayout
    UICollectionView框架总结
    UICollectionView
  • 原文地址:https://www.cnblogs.com/mollnn/p/12304408.html
Copyright © 2020-2023  润新知