• 题解【CF859C】Pie Rules


    题面

    一道需要一定思考的 ( ext{DP})

    (dp_i) 表示第 (i) 步走的人能得到的最大分数, (sum_i) 表示 (sum_{j=i}^n a_j) ,即 (sum_i) 为序列 ({a_i}) 的后缀和。

    状态转移方程: (dp_i=max{dp_{i+1}, sum_{i+1}-dp_{i+1}+a_i})

    解释一下:

    • (dp_{i+1}) 的意思是第 (i+1) 个决策的人将 (a_{i+1}) 给了对方,自己还是第 (i) 个决策的人;
    • (sum_{i+1}-dp_{i+1}+a_i) 的意思是第 (i+1) 个决策的人不是第 (i) 个决策的人,第 (i+1) 个决策的人得到了 (dp_{i+1}) 的分数,则第 (i+1) 轮后第 (i) 个决策的人得到了 (sum_{i+1} - dp_{i+1}) 的分数,第 (i) 个决策的人在第 (i) 轮还得到了 (a_i) 的分数。

    可能比较难理解…

    代码写起来也很简单:

    #include <bits/stdc++.h>
    #define DEBUG fprintf(stderr, "Passing [%s] line %d
    ", __FUNCTION__, __LINE__)
    #define itn int
    #define gI gi
    
    using namespace std;
    
    inline int gi()
    {
    	int f = 1, x = 0; char c = getchar();
    	while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
    	while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    	return f * x;
    }
    
    int n, m, a[55], sum[55], dp[55];
    
    int main()
    {
    	//freopen(".in", "r", stdin);
    	//freopen(".out", "w", stdout);
    	n = gi();
    	for (int i = 1; i <= n; i+=1) a[i] = gi();
    	for (int i = n; i >= 1; i-=1) sum[i] = sum[i + 1] + a[i];
    	for (int i = n; i >= 1; i-=1) dp[i] = max(dp[i + 1], sum[i + 1] - dp[i + 1] + a[i]);
    	printf("%d %d
    ", sum[1] - dp[1], dp[1]);
    	return 0;
    }
    
  • 相关阅读:
    虚拟DOM和diff算法
    面向对象之封装
    面向对象之类和函数的属性
    面向对象之__init__方法
    面向对象之初始类和对象
    面向对象与面向过程详解
    CSS高级技巧
    CSS定位
    模块之re模块详解
    模块之logging模块详解
  • 原文地址:https://www.cnblogs.com/xsl19/p/12285673.html
Copyright © 2020-2023  润新知