时间限制: 1000 ms 内存限制: 524288 KB
Description
Input
Output
Sample Input
4
-1 10 -20
2 2 3 4
-1 10 -20
2 2 3 4
Sample Output
9
HINT
sol:斜率优化dp裸题
j<k<i 若k比j优
dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c (1)
dp[k]+a*(Qzh[i]-Qzh[k])*(Qzh[i]-Qzh[k])+b*(Qzh[i]-Qzh[k])+c (2)
(2) >= (1)
dp[j]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]+b*Qzh[i]-b*Qzh[j]+c (1)
dp[k]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]+b*Qzh[i]-b*Qzh[k]+c (2)
若 (2) >= (1) 则
dp[k]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k] >= dp[j]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]
则
(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]) >= a*2*Qzh[i]*(Qzh[k]-Qzh[j])
#include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)) { s=(s<<3)+(s<<1)+(ch^48); ch=getchar(); } return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) { putchar('-'); x=-x; } if(x<10) { putchar(x+'0'); return; } write(x/10); putchar((x%10)+'0'); return; } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar(' ') const int N=1000005; int n,a,b,c; ll Qzh[N]; ll dp[N]; int main() { // freopen("commando3.in","r",stdin); int i,j; R(n); R(a); R(b); R(c); for(i=1;i<=n;i++) { Qzh[i]=Qzh[i-1]+read(); } memset(dp,-63,sizeof dp); dp[0]=0; for(i=1;i<=n;i++) { for(j=0;j<i;j++) { dp[i]=max(dp[i],dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c); } } Wl(dp[n]); return 0; } /* input 4 -1 10 -20 2 2 3 4 output 9 */
/* j<k<i 若k比j优 dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c (1) dp[k]+a*(Qzh[i]-Qzh[k])*(Qzh[i]-Qzh[k])+b*(Qzh[i]-Qzh[k])+c (2) (2) >= (1) dp[j]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]+b*Qzh[i]-b*Qzh[j]+c (1) dp[k]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]+b*Qzh[i]-b*Qzh[k]+c (2) 若 (2) >= (1) 则 dp[k]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k] >= dp[j]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j] 则 (dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]) >= a*2*Qzh[i]*(Qzh[k]-Qzh[j]) */ #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)) { s=(s<<3)+(s<<1)+(ch^48); ch=getchar(); } return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) { putchar('-'); x=-x; } if(x<10) { putchar(x+'0'); return; } write(x/10); putchar((x%10)+'0'); return; } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar(' ') const int N=1000005; int n,a,b,c; ll Qzh[N]; ll dp[N],Que[N]; inline bool Panduan(int j,int k,int i) //j<k<i { ll S1=(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]); ll S2=a*2*Qzh[i]*(Qzh[k]-Qzh[j]); return (S1>=S2)?(1):(0); } //(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]) >= a*2*Qzh[i]*(Qzh[k]-Qzh[j]) inline bool Panduan_Rev(int j,int k,int i) //j<k<i { ll S1=((dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]))*(Qzh[i]-Qzh[k]); ll S2=((dp[i]+a*Qzh[i]*Qzh[i]-b*Qzh[i])-(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k]))*(Qzh[k]-Qzh[j]); return (S1<=S2)?(1):(0); } int main() { int i,j; R(n); R(a); R(b); R(c); for(i=1;i<=n;i++) { Qzh[i]=Qzh[i-1]+read(); } dp[0]=0; int Head=1,Tail=1; Que[1]=0; for(i=1;i<=n;i++) { while(Head<Tail&&Panduan(Que[Head],Que[Head+1],i)) Head++; j=Que[Head]; dp[i]=dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c; while(Head<Tail&&Panduan_Rev(Que[Tail-1],Que[Tail],i)) Tail--; Que[++Tail]=i; } Wl(dp[n]); return 0; } /* input 4 -1 10 -20 2 2 3 4 output 9 */