1. 程式人生 > >洛谷P4072 [SDOI2016]征途(斜率優化)

洛谷P4072 [SDOI2016]征途(斜率優化)

傳送門 tps double nbsp ble esp 就是 int turn

傳送門

推式子(快哭了……)$$s^2*m^2=\sum _{i=1}^m (x_i-\bar{x})^2$$

$$s^2*m^2=m*\sum _{i=1}^m x_i^2-2*sum_n\sum _{i=1}^m x_i+sum_n^2$$

$$s^2*m^2=m*\sum _{i=1}^m x_i^2+(sum_n-\sum _{i=1}^m x_i)^2-(\sum _{i=1}^m x_i)^2$$

然後因為$sum_n$和$\sum _{i=1}^m x_i$兩項是定值,且值相等,所以$$s^2*m^2=m*\sum _{i=1}^m x_i^2-(\sum _{i=1}^m x_i)^2$$

我們發現$(\sum _{i=1}^m x_i)^2$是一個定值,那麽我們的目的就是讓$\sum _{i=1}^m x_i^2$最小

總算扯到dp上了不容易啊……

我們設$dp[i][l]$表示前$i$條路$l$天走,最小的\sum _{a=1}^i x_a^2是多少,那麽有如下的狀態轉移方程$$dp[i][l]=min\{dp[j][l-1]+(sum[i]-sum[j])^2\}$$

然後考慮斜率優化(以下省略$l$這一維)

假設$j$比$k$更優,則有$$dp[j]+(sum[i]-sum[j])^2<dp[k]+(sum[i]-sum[k])^2$$

展開,移項$$dp[j]+sum[j]^2-dp[k]-sum[k]^2<2*sum[i]*sum[j]-2*sum[i]*sum[k]$$

$$\frac{dp[j]+sum[j]^2-dp[k]-sum[k]^2}{sum[j]-sum[k]}<2*sum[i]$$

然後就可以上斜率優化了

ps:註意當$l$為$0$的時候dp要都初始化為$sum[i]^2$

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #define ll long long
 5 using namespace
std; 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 7 char buf[1<<21],*p1=buf,*p2=buf; 8 inline int read(){ 9 #define num ch-‘0‘ 10 char ch;bool flag=0;int res; 11 while(!isdigit(ch=getc())) 12 (ch==-)&&(flag=true); 13 for(res=num;isdigit(ch=getc());res=res*10+num); 14 (flag)&&(res=-res); 15 #undef num 16 return res; 17 } 18 const int N=3005; 19 ll sum[N],sp[N],dp[N];int n,m,h,t,q[N],r; 20 inline ll Y(int i){return sp[i]+sum[i]*sum[i];} 21 inline double slope(int j,int k){ 22 return (Y(j)-Y(k))*1.0/(sum[j]-sum[k]); 23 } 24 int main(){ 25 //freopen("testdata.in","r",stdin); 26 n=read(),m=read(); 27 for(int i=1;i<=n;++i) 28 sum[i]=read()+sum[i-1],sp[i]=sum[i]*sum[i]; 29 for(int a=1;a<m;++a){ 30 h=t=0;q[0]=a; 31 for(int i=a+1;i<=n;++i){ 32 while(h<t&&slope(q[h],q[h+1])<2*sum[i]) ++h; 33 dp[i]=sp[q[h]]+(sum[i]-sum[q[h]])*(sum[i]-sum[q[h]]); 34 while(h<t&&slope(q[t],q[t-1])>slope(q[t-1],i)) --t;q[++t]=i; 35 } 36 for(int i=1;i<=n;++i) sp[i]=dp[i]; 37 } 38 printf("%lld\n",-sum[n]*sum[n]+m*dp[n]); 39 return 0; 40 }

洛谷P4072 [SDOI2016]征途(斜率優化)