博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 855B 简单DP
阅读量:5326 次
发布时间:2019-06-14

本文共 1289 字,大约阅读时间需要 4 分钟。

传送门:

emmmmmm……n比较打,1e15直接暴力的话会T,还有要注意的一点就是选取的ai,aj,ak,下标满足i<=j<=k,orz做的时候没注意WA了好多次orz

这里要用到的是简单的DP,循环扫2遍分别从头到尾,从尾到头记录至今为止的最大最小值,(因为要求pai+qaj+rak的最大值,所以只需要p,q,r>0时*最大值,<0时*最小值就好了,问题就在于如何处理下标不交叉的问题,dp的思想就是用来处理下标和最值之间的问题)从头到尾扫一遍记录的是ai在取aj时的值,从尾到头记录的是ak在取aj时的值,然后只需要再扫一遍记录到i处pai+qaj+rak的最大值就可以了。

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;ll a[100005];int n, p[3];ll maxx1[100005], minn1[100005];ll maxx2[100005], minn2[100005];int main(){ cin >> n; cin >> p[0] >> p[1] >> p[2]; for (int i = 1; i <= n; i++) cin >> a[i]; minn1[0]=1e18; maxx1[0] = -1e18; minn2[n + 1] = 1e18; maxx2[n + 1] = -1e18; for (int i = 1; i <= n; i++) { maxx1[i] = max(maxx1[i - 1], a[i]); minn1[i] = min(minn1[i - 1], a[i]); } for (int i = n; i >= 1; i--) { maxx2[i] = max(maxx2[i + 1], a[i]); minn2[i] = min(minn2[i + 1], a[i]); } ll ans = -4e18; for (int i = 1; i <= n; i++) { ll tmp = 0; if (p[0] >= 0) tmp += p[0] * maxx1[i]; else tmp += p[0] * minn1[i]; if (p[2] >= 0) tmp += p[2] * maxx2[i]; else tmp += p[2] * minn2[i]; ans = max(ans, tmp + p[1] * a[i]); } cout << ans << endl; return 0;}

 

转载于:https://www.cnblogs.com/Egoist-/p/7596911.html

你可能感兴趣的文章
当心JavaScript奇葩的逗号表达式
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>
织梦MIP文章内容页图片适配百度MIP规范
查看>>
点击复制插件clipboard.js
查看>>
[Kali_BT]通过低版本SerialPort蓝牙渗透功能手机
查看>>
C语言学习总结(三) 复杂类型
查看>>
HNOI2018
查看>>
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>
stm32中字节对齐问题(__align(n),__packed用法)
查看>>
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
spring-使用MyEcilpse创建demo
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>