3.29 每日一题题解

Marvolo Gaunt's Ring

涉及知识点:

  • 前缀后缀/dp

solution:

  • 首先枚举p和前缀的最大值,pre[i]表示p和a[1~i]的最大值乘积
  • 然后枚举r和后缀的最大值,fpre[i]表示r和a[i~n]的最大值乘积
  • 最后遍历1~n枚举q×a[i],ans = MAX(pre[i] + fpre[i] + q×a[i])

std:

#include <bits/stdc++.h>
using namespace std;
#define ll  long long
const int maxn = 100005;
const ll inf = LLONG_MAX;
ll a[maxn];
ll pre[maxn],fpre[maxn];
int main()
{
    ll n,p,q,r,ans = -inf;
    cin>>n>>p>>q>>r;
    for(int i=1;i<=n;i++)cin>>a[i];
    pre[0] = -inf,fpre[n+1] = -inf;
    for(int i=1;i<=n;i++)
        pre[i] = max(pre[i-1] , a[i]*p);
    for(int i=n;i>=1;i--)
        fpre[i] = max(fpre[i+1],a[i]*r);
    for(int i=1;i<=n;i++)
        ans = max(ans , pre[i] + fpre[i] + a[i]*q);
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/QFNU-ACM/p/12591127.html