专栏文章

题解: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 个月前
查看原文

题意

给定一个长度为 nn 的序列 {an}\{a_n\} 和一个初始为空的栈 SS,对于每个 i[1,n]i\in [1,n],依次进行下面两种操作中的其中一种:
  • aia_i 推入栈顶;
  • 如果栈不为空,将栈顶元素删除。(注意:删除后并不将 aia_i 推入栈顶
完成所有操作后,求最终可能得到的栈 SS 中所有元素之和的最大值。

思路分析

简单 DP。
fif_i 表示操作已经进行完 aia_i 时栈 SS 内元素之和的最大值。
显然,我们要求的答案就是 fnf_n,初始状态就是 f0=0f_0=0(栈为空时元素和为 00),f1=a1f_1=a_1
fi1f_{i-1} 转移到 fif_i 的方式把题意翻译一下就出来了:
  • 如果我们选择操作 11,那么 fi=fi1+aif_i=f_{i-1}+a_i
  • 如果我们选择操作 22,即只删除栈顶元素,那么 fif_i 就等价于我们上一次操作不选 ai1a_{i-1} 的值,即 fi2f_{i-2}
上面两种情况取个最大值就行了。

代码实现

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 条评论,欢迎与作者交流。

正在加载评论...