CodeForces - 855B Marvolo Gaunt's Ring

Posted on 2022-11-06 11:55  Capterlliar  阅读(23)  评论(0编辑  收藏  举报

题意:给定数组a,求p·ai + q·aj + r·ak的最大值,i ≤ j ≤ k。

解:先确定两边再确定中间,两边的话到每个位置最大值是确定的,可以提前计算;枚举每个数作为aj,直接计算答案即可。需要注意的是有符数,最小值要设的足够小。不知道为什么放在背包问题里诶。

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxx 100005
#define maxn 25
#define maxm 205
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
#define mod 2520
ll a[maxx]={0},b[maxx]={0},c[maxx]={0};
signed main() {
//    int T;
//    scanf("%d",&T);
//    while(T--) {
//
//    }
    ll n,p,r,q;
    scanf("%lld%lld%lld%lld",&n,&p,&q,&r);
    for(int i=1;i<=n;i++){
        scanf("%lld", &a[i]);
    }
    for(int i=0;i<=n+1;i++){
        b[i]=c[i]=-inf;
    }
    for(int i=1;i<=n;i++){
        b[i]=max(b[i-1],a[i]*p);
    }
    for(int i=n;i>0;i--){
        c[i]=max(c[i+1],r*a[i]);
    }
    ll ans=-inf;
    for(int i=1;i<=n;i++){
        ans=max(ans,b[i]+c[i]+q*a[i]);
    }
    printf("%lld\n",ans);
    return 0;
}
//dp[pos][lcm][mod]
View Code