题意:给定数组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]