动态优化解题方法探究.pdfVIP

  • 0
  • 0
  • 约1.76千字
  • 约 2页
  • 2025-12-26 发布于北京
  • 举报

本题实质是从第一层i....j之间

找续最小的和min使sum1[j]-sum1[i-1]+sum2[j]-sum[i-1]-min最大

首先易写出一个4层的:

Fori:=1tondo

Forj:=itondo

Begin

Min:=maxlongint;

Forii:=i+1toj-1do

Fork:=iitoj-1do

Ifsum[k]-sum[ii-1]min

Thenmin:=sum[k]-sum[ii-1];

T:=sum1[j]-sum1[i-1]+sum2[j]-sum[i-1]-min;

Iftansthenans:=t;

End;

观察整个程序发现在找min时浪费了大量的时间!能否有更快的方法呢?

联想到绿书上的一道题求一段数的最大数只用了一层循环!!!!是否时候这里呢?答

案是肯定的。于是可以编出如下程序:

Fori:=1tondo

Forj:=itondo

Begin

T:=0;Min:=maxlongint;

Fork:=i+1toj-1do

Begin

Inc(t,a[k]);

Ift0thent:=0;

Iftminthenmin:=t;

End;

T:=sum1[j]-sum1[i-1]+sum2[j]-sum[i-1]-min;

Iftansthenans:=t;

End;

通过更加深入思考,其实k大可不必!!!

因为当j加一时前一k的循环范围为i+1j-2

此时的k为i+1j-1只增加1!!!

继续修改以上程序可得:

fori:=1tondo

begin

t:=0;min:=0;

forj:=itondo

begin

ifj-1ithen

inc(t,a[j-1]);

ift0thent:=0;

ifmintthenmin:=t;

x:=sum2[j]-sum2[i-1]+sum1[j]-sum1[i-1]-min;

ifxansthenans:=x;

end;

end;

Theend.Thanks.

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档