[关闭]
@lychee123 2017-01-15T11:31:39.000000Z 字数 1697 阅读 877

HDU 3507 Print Article

dp斜率优化


题面链接

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stack>
  4. #include<algorithm>
  5. using namespace std;
  6. int n,m,a[500010],dp[5000010],sum[500010];
  7. int que[500010];
  8. int getdp(int i,int j)
  9. {
  10. return dp[j]+(sum[i]-sum[j])*(sum[i]-sum[j])+m;
  11. }
  12. int getup(int j,int k)
  13. {
  14. return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]);
  15. }
  16. int getdown(int j,int k)
  17. {
  18. return 2*(sum[j]-sum[k]);
  19. }
  20. int main()
  21. {
  22. int i,j,k;
  23. while(~scanf("%d%d",&n,&m))
  24. {
  25. if(n==0)
  26. continue;
  27. memset(sum,0,sizeof(sum));
  28. memset(dp,0,sizeof(dp));
  29. memset(que,0,sizeof(que));
  30. int l1=0,l2=1;
  31. for(i=1;i<=n;i++)
  32. {
  33. scanf("%d",&a[i]);
  34. sum[i]=a[i]+sum[i-1];
  35. }
  36. for(i=1;i<=n;i++)
  37. {
  38. while(l1+1<l2&&getup(que[l1+1],que[l1])<=sum[i]*getdown(que[l1+1],que[l1]))
  39. l1++;
  40. dp[i]=getdp(i,que[l1]);
  41. while(l1+1<l2&&getup(i,que[l2-1])*getdown(que[l2-1],que[l2-2])<=getup(que[l2-1],que[l2-2])*getdown(i,que[l2-1]))
  42. l2--;
  43. que[l2++]=i;
  44. }
  45. printf("%d\n",dp[n]);
  46. }
  47. return 0;
  48. }

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注