Индуктивное расширение функции / INDFUN2
.rtfprogram Inductive_function_1;
{----------------------------------------------------------------------------}
{ Пример вычисления индуктивного расширения функции : }
{ f( w ) = " Сумма элементов отрезка с максимальной суммой " , }
{ где отрезок - связная подпоследовательность заданной последовательности w. }
{ Пусть исходная последовательность есть w = x(1)x(2)...x(n) и пусть }
{ S(k,l) = SUM ( k <= i <= l : x(i) ), где 1 <= k <= l <= n . Тогда }
{ f(w) = max ( S(k,l) : 1 <= k <= l <= n ) . }
{ Функция f - неиндуктивна. Рассмотрим индуктивное расширение F = ( f, t ), }
{ где }
{ t( w ) = max ( S(j,n) : 1 <= j <= n ). }
{ Содержательно t(w) - потенциальный конкурент текущего рекорда f(w) при }
{ продолжении последовательности w . Вычисление f и t : }
{ t ( w * x ) = max ( x, x + t(w) ), }
{ f ( w * x ) = max ( f(w), t(w*x) ), }
{ t ( $ ) = 0, f( $ ) = MinInt. }
{ Здесь $ обозначает пустую последовательность. }
{ Исходная последовательность читается из файла INITSEQ.DAT . }
{----------------------------------------------------------------------------}
const MinInt = -32768;
var x, { очередной элемент последовательности }
y, { y = f ( w ) }
z : Integer; { z = t ( w ) }
fin, { input file }
fout : Text ; { output file }
begin
Assign( fin, 'INITSEQ.DAT' );
Assign( fout, {'INFREZ.DAT'}'' );
Rewrite( fout );
WriteLn( fout, 'элемент: рекорд: конкурент:' );
Reset( fin ); { L(fin)=$ }
y := MinInt; { y=f($) }
z := 0; { z=t($) }
{ inv : y=f(L(fin)) & z=t(L(fin)) }
{ bound: length(R(fin)) }
while not Eof(fin) do
begin
Read( fin, x );
Write( fout, x : 8 );
{ новый конкурент : }
if z>0 then z := z + x else z := x;
{ новый рекорд : }
if z>y
then { обновить рекорд }
begin
y := z;
WriteLn( fout, y : 9 )
end
else { оставить старый }
WriteLn( fout , z : 20 );
end { while };
{ y = f ( fin ) & z = t( fin ) }
WriteLn( fout, '****** Максимальная сумма = ', y, ' ******' );
Close( fin );
Close( fout )
end { Inductive_function_1 } .
Экран результатов |
элемент: рекорд: конкурент: 1 1 2 3 -5 -2 3 3 6 9 -10 -1 6 6 9 15 1 16 -5 11 ****** Максимальная сумма = 16 ******
|