poj 3709 K-Anonymous Sequence

系统 1433 0

终于把最后一道优化DP的题目做了,斜率优化之前掌握的不是非常熟练呀。

朴素方程:f[i]=min{f[k]+s[i]-s[k]-a[k+1]*(i-k)}。

就这么一个朴素方程的化简,搞了很久。

把减号写成加号导致化简完全错误,纠结于直接用double还是用int64的x和y,后来有纠结于≤和≥的问题。这才完全搞定斜率优化。不错的题目。

代码:

      var

  q,f,s,a:array[0..500002] of int64;

  head,tail,n,m,i,j,t:longint;

  k,xx,yy,zz:int64;



function y(k,j:longint):int64;

begin

  exit(f[k]-f[j]+s[j]-s[k]-a[j+1]*j+a[k+1]*k);

end;



function x(k,j:longint):int64;

begin

  exit(a[k+1]-a[j+1]);

end;



begin

  readln(t);

  while t>0 do

    begin

      dec(t);

      readln(n,m);

      for i:=1 to n do

        begin

          read(a[i]);

          s[i]:=s[i-1]+a[i];

        end;

      f[0]:=0;

      head:=0;

      tail:=0;

      q[0]:=0;

      for i:=1 to n do

        begin

          while (head<tail)and(y(q[head],q[head+1])>=i*x(q[head],q[head+1]))

          do inc(head);

          k:=q[head];

          f[i]:=f[k]+s[i]-s[k]-a[k+1]*(i-k);

          if i>=2*m-1 then

            begin

              zz:=i-m+1;

              while head<tail do

                begin

                  xx:=q[tail-1];

                  yy:=q[tail];

                  if y(xx,yy)*x(yy,zz)>=(y(yy,zz)*x(xx,yy)) then dec(tail)

                  else break;

                end;

              inc(tail);

              q[tail]:=zz;

            end;

         end;

      writeln(f[n]);

    end;

end.


    

poj 3709 K-Anonymous Sequence


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论