CF1313C2 Skyscrapers (hard version) -单调栈优化dp

这篇博客讨论了一种算法问题,涉及给定数组A,目标是构造一个新的数组B,使得B先增再减或只增只减,且满足bi <= ai的条件,同时使B的元素之和最大化。文章通过使用栈数据结构求解了next和prev数组,并采用动态规划方法找到了最优解。

给定一个数组A,构造一个数组B,满足,B先增再减(或者只增,只减), 且 bi <= ai
使得∑bi最大

#include <algorithm>
#include <vector>
#include <stack>
#define ll long long
#define PII pair<int, int>
#define FOR(i, s, e) for (int i = s; i <= e;i++)
#define ROF(i, e, s) for (int i = e; i >= s;i--)
#define debug(a) cout << #a << "=" << a << endl;
#define pb(a) push_back(a)
#define endl '\n'
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3f 
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 7;
void init_code(){
	#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
	#endif
}


ll a[N],n;
int nex[N],prv[N];
ll f[N],fl[N],fr[N];
void NLE(){
	a[0]=-INF,a[n+1]=-INF;  // 设置默认值
	stack<int>st;
	//求nxt
	FOR(i,1,n+1){
		while(!st.empty() && a[st.top()]>a[i]){
			nex[st.top()]=i; st.pop();
		}   st.push(i);
	}	st.pop();
	//求prv
	ROF(i,n,0){
		while(!st.empty() && a[st.top()]>a[i]){
			prv[
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值