1. 程式人生 > >CF859C Pie Rules 動態規劃 逆推_思維題

CF859C Pie Rules 動態規劃 逆推_思維題

題意:有 nn 個物品,每個物品有不同的價值,物品按順序分給兩個人,有一塊令牌,每回合擁有令牌的人擁有物品的分配權,但是該回合未獲得物品的那個人會在下回合獲得令牌,開始令牌在Bob手裡,兩個人都採取最優的策略,問最後各能獲得的最大價值是多少。

我們設狀態 dp[i]dp[i] 為輪到第 ii 個物品時擁有令牌所能獲得的最大值。 如果正著進行求解會有些困難,我們不妨考慮逆著求解: 1.取當前的價值,那說明在上一回閤中是不能有令牌的,即 dp[i]=sum[i+1]dp[i+1]+val[i]dp[i] =sum[i+1]-dp[i+1]+val[i]

dp[i+1]+val[i] 2.不取當前的價值,那說明在上一回閤中是有令牌的,即dp[i]=dp[i+1]dp[i] = dp[i+1] (注意雙方都是最優策略)

Code:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int sum[55], dp[55], val[55],  n;
int main()
{ 
    cin >> n;
    for(int i = 1;i <= n; ++i) cin >>
val[i]; for(int i = n;i >= 1; --i) { sum[i] = sum[i + 1] + val[i]; dp[i] = max(dp[i + 1], sum[i + 1] - dp[i + 1] + val[i]); } cout << sum[1] - dp[1] << " " << dp[1] ; return 0; }