题解:AT_arc194_a [ARC194A] Operations on a Stack
cold_jelly · · 题解
题意
给定一个长度为
- 将
a_i 推入栈顶; - 如果栈不为空,将栈顶元素删除。(注意:删除后并不将
a_i 推入栈顶)
完成所有操作后,求最终可能得到的栈
思路分析
简单 DP。
令
显然,我们要求的答案就是
从
- 如果我们选择操作
1 ,那么f_i=f_{i-1}+a_i ; - 如果我们选择操作
2 ,即只删除栈顶元素,那么f_i 就等价于我们上一次操作不选a_{i-1} 的值,即f_{i-2} 。
上面两种情况取个最大值就行了。
代码实现
#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;
}