zoukankan      html  css  js  c++  java
  • 题解【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;
    }
    
  • 相关阅读:
    背包问题--动态规划
    day03_13 多分支if语句及作业
    day03_12 缩进介绍
    day03_11 if语句实现猜年龄01
    day03_10 注释及简单的用户输入输出
    day03_09 编码部分历史及文件编码简介
    day03_07 变量的重新赋值01
    day03_06 变量详解
    day03_05 Python程序文件执行和与其他编程语言对比
    day03_04 文件后缀及系统环境变量
  • 原文地址:https://www.cnblogs.com/xsl19/p/12285673.html
Copyright © 2011-2022 走看看