标签:
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 8199 Accepted Submission(s): 2549
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int maxn=500010; 5 long long f[maxn],s[maxn]; 6 int q[maxn]; 7 int main() 8 { 9 int n,m,front,back; 10 while(~scanf("%d%d",&n,&m)) 11 { 12 s[0]=f[0]=0; 13 for(int i=1;i<=n;i++)scanf("%d",&s[i]); 14 for(int i=2;i<=n;i++)s[i]+=s[i-1]; 15 16 front=1;back=2; 17 q[front]=0; 18 19 for(int i=1;i<=n;i++) 20 { 21 while(front<back-1&&(f[q[front+1]]+s[q[front+1]]*s[q[front+1]])-(f[q[front]]+s[q[front]]*s[q[front]])<=2*s[i]*(s[q[front+1]]-s[q[front]])) front++; 22 23 f[i]=f[q[front]]+(s[i]-s[q[front]])*(s[i]-s[q[front]])+m; 24 25 while(front<back-1&&(s[q[back-1]]-s[q[back-2]])*((f[i]+s[i]*s[i])-(f[q[back-1]]+s[q[back-1]]*s[q[back-1]]))<=(s[i]-s[q[back-1]])*((f[q[back-1]]+s[q[back-1]]*s[q[back-1]])-(f[q[back-2]]+s[q[back-2]]*s[q[back-2]])))back--; 26 q[back++]=i; 27 } 28 printf("%lld\n",f[n]); 29 } 30 return 0; 31 }
DP(斜率优化):HDU 3507 Print Article
标签:
原文地址:http://www.cnblogs.com/TenderRun/p/5249644.html