HDU 3507 Print Article(DP+斜率优化)
对这个 真心不太懂,看这了这个博客,这个博客,这个博客,后有点了解原理了。
斜率优化也是建立在单调队列的基础上的,以上3个博客讲的很详细。把方程写出来,推导公式才是最主要的问题。。。
代码参考题解。 以后再遇到这样的问题慢慢理解吧。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define N 500001 5 __int64 dp[N],que[N],p[N],sum[N]; 6 int slope(int x,int y) 7 { 8 if(sum[x] == sum[y]) 9 { 10 if(dp[x] > dp[y]) 11 return -1; 12 else 13 return 2147483647; 14 } 15 return (dp[x]-dp[y]+sum[x]*sum[x]-sum[y]*sum[y])/(sum[x]-sum[y]); 16 } 17 int main() 18 { 19 int n,m,i,str,end; 20 while(scanf("%d%d",&n,&m)!=EOF) 21 { 22 for(i = 1;i <= n;i ++) 23 { 24 scanf("%I64d",&p[i]); 25 sum[i] = p[i]+sum[i-1]; 26 } 27 str = end = 0; 28 for(i = 1;i <= n;i ++) 29 { 30 while(str < end&&slope(que[str],que[str+1]) < 2*sum[i]) 31 str ++; 32 dp[i] = dp[que[str]] + (sum[i]-sum[que[str]])*(sum[i]-sum[que[str]]) + m; 33 while(str < end&&slope(que[end-1],que[end]) > slope(que[end],i)) 34 end --; 35 end ++; 36 que[end] = i; 37 } 38 printf("%I64d\n",dp[n]); 39 } 40 return 0; 41 }