题目链接:P6625 [省选联考 2020 B 卷] 卡牌游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
轩轩某天想到了一个卡牌游戏,游戏规则如下:
1. 初始时轩轩的手中有自左向右排成一排的 n 张卡牌,每张卡牌上有一个整数分值。
2. 接下来,轩轩每次可以选取卡牌序列最左边的连续若干张卡牌(至少 2 张),将它们替换为一张新卡牌。新卡牌将插入到序列的最左端,它的分值为本次操作中被替换掉的卡牌的分值之和。
3. 初始时轩轩总分为 0,每执行一次卡牌替换操作,新卡牌的分值将加到总分中。当序列长度为 1 时游戏结束,轩轩也可以在任意时刻结束游戏。
现在给出序列中各个卡牌的分值,请你来帮助轩轩计算他能够获得的最高总分是多少?
输入格式
第一行一个正整数 n,代表卡牌的数目。
接下来一行 n 个以空格分隔的整数,第 i 个数字 ai 代表自左向右第 i 张卡牌的分值。
输出格式
仅一行一个整数表示答案。
样例 #1
样例输入 #1
3
2 -1 2
样例输出 #1
4
样例 #2
样例输入 #2
7
-4 3 0 7 -3 -5 -3
样例输出 #2
9
提示
样例解释 1
最优策略为,首先选择最左侧的两张卡牌,总分增加 2 + (-1) = 1。此时轩轩选择的两张卡牌被替换为一张分值为 1 的卡牌,且被放入序列最左侧,此时自左向右卡牌的分值为 1 和 2。
接下来选择当前序列中所有卡牌,总分增加 1 + 2 = 3,总分为 4。此时轩轩选择的两张卡牌被替换为一张分值为 3 的卡牌,且被放入序列最左侧,此时序列中只有一张分值为 3 的卡牌,游戏结束。
样例解释 2
最优策略为,首先选择最左侧的四张卡牌,总分增加 (-4) + 3 + 0 + 7 = 6。此时轩轩选择的四张卡牌被替换为一张分值为 6 的卡牌,且被放入序列最左侧,此时自左向右卡牌的分值为 6, -3, -5, -3。
再选择最左侧的两张卡牌,总分增加 6 + (-3) = 3,总分为 9。此时轩轩选择的两张卡牌被替换为一张分值为 3 的卡牌,且被放入序列最左侧,此时自左向右卡牌的分值为 3, -5, -3。
此时无论如何操作均无法使总分继续增大,轩轩选择结束游戏。
数据范围与约定
测试点 1 ~ 6 满足:1 <= n <= 16, |ai| <= 100。
测试点 7 ~ 12 满足:1 <= n <= 10^3, |ai| <= 100。
测试点 13 ~ 20 满足:1 <= n <= 10^5, |ai| <= 10^5。
AC code:
#include<iostream>
#include<algorithm>
#include<vector>using namespace std;typedef long long ll;int main()
{ll n;cin>>n;vector<ll> a(n + 1);for(ll i = 1 ; i <= n ; i ++)cin>>a[i];vector<ll> preSum(n + 1);for(ll i = 1 ; i <= n ; i ++)preSum[i] = preSum[i - 1] + a[i];ll res = 0;for(ll i = 2 ; i <= n ; i ++){if(preSum[i] > 0){res += preSum[i];}}cout<<res;return 0;
}