专栏文章
题解:AT_arc194_a [ARC194A] Operations on a Stack
AT_arc194_a题解参与者 4已保存评论 5
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mipxc2d4
- 此快照首次捕获于
- 2025/12/03 19:28 3 个月前
- 此快照最后确认于
- 2025/12/03 19:28 3 个月前
题意
给定一个长度为 的序列 和一个初始为空的栈 ,对于每个 ,依次进行下面两种操作中的其中一种:
- 将 推入栈顶;
- 如果栈不为空,将栈顶元素删除。(注意:删除后并不将 推入栈顶)
完成所有操作后,求最终可能得到的栈 中所有元素之和的最大值。
思路分析
简单 DP。
令 表示操作已经进行完 时栈 内元素之和的最大值。
显然,我们要求的答案就是 ,初始状态就是 (栈为空时元素和为 ),。
从 转移到 的方式把题意翻译一下就出来了:
- 如果我们选择操作 ,那么 ;
- 如果我们选择操作 ,即只删除栈顶元素,那么 就等价于我们上一次操作不选 的值,即 。
上面两种情况取个最大值就行了。
代码实现
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int n;
int a[N], f[N];
signed main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
scanf("%lld", &a[i]);
f[0] = 1, f[1] = a[1];
for(int i = 2; i <= n; i ++)
f[i] = max(f[i - 1] + a[i], f[i - 2]);
cout << f[n];
return 0;
}
相关推荐
评论
共 5 条评论,欢迎与作者交流。
正在加载评论...