Documente Academic
Documente Profesional
Documente Cultură
Metoda Inainte PDF
Metoda Inainte PDF
Metoda nainte
Problema triunghiului
Se consider un triunghi de numere naturale format din n linii. Prima linie conine
un numr, a doua dou numere, ... ,ultima n numere naturale. Cu ajutorul acestui
triunghi se pot forma sume de numere naturale n felul urmtor:
se pornete cu numrul din linia 1;
succesorul unui numr se afl pe linia urmtoare plasat sub el (aceeai
coloan) sau pe diagonal la dreapta (coloana crete cu 1).
Care este cea mai mare suma care se poate forma astfel i care sunt numerele
care o alctuiesc?
Exemplu: n=4
2
3 5
6 3 4
56 14
writeln('suma este:',c[1,1]);
i:=1;j:=1;
while i<=n do
begin
write(t[i,j]:3);
j:=drum[i,j];
i:=i+1;
end;
readkey;
end.
subirului relativ la vectorul dat. Se observ c, n aceast situaie Vk ,..., Vip este lungimea
celui mai lung subir cresctor care se poate forma ncepnd cu elementul V k Acest fapt se
demonstreaz prin reducere la absurd. Presupunem c se poate forma un subir cresctor
de lungime mai mare ncepnd cu elementul V k . Atunci Vi1 , Vi 2 ,..., Vik ,..., Vip nu este cel mai
lung subir care se poate forma i conine elementul V k , deci ipoteza este contrazis. Am
lungimea celui mai lung subir cresctor ce se poate forma ncepnd cu elementul k al
vectorului, vom avea relaiile:
L(k ) { 1 max L(i) V (i) V (k ) , i {k 1,...,n}}, k {1,2,...,n}
n practic, vom folosi un vector L cu n componente, unde L(k) are semnificaia
explicat. Pentru exemplul nostru vom avea: L = ( 3 , 3 , 2 , 2 , 1 ) . Componentele vectorului L
au fost calculate astfel:
cel mai lung subir care se poate forma cu elementul 7, aflat pe ultima
poziie, are lungimea 1;
cel mai lung subir care se poate forma cu elementul 6 aflat pe poziia
4 are lungimea 2, (1+L(5)), pentru c pe poziia 5 se gsete elementul
7 care este mai mare dect 6;
cel mai lung subir care se poate forma cu elementul aflat pe poziia 3
are lungimea 2, (1+L(5)) pentru c 7 este egal cu 7;
algoritmul continu n acest mod pn se completeaz L(1).
Dup aceasta se calculeaz maximul dintre componentele lui L, iar cel mai lung
subir cresctor format din elementele vectorului V va avea lungimea dat de acest
maxim.
Pentru a lista efectiv acel subir de lungime maximal se procedeaz astfel:
se caut maximul din vectorul L precum i indicele t, la care se gsete
acest maxim;
se listeaz V(t);
se gsete i se listeaz primul element care este mai mare sau egal
cu V(t) i are lungimea mai mic cu 1 (max-1), se actualizeaz valoarea
max cu max-1;
algoritmul continu pn cnd se epuizeaz toate elementele subirului.
Programul Pascal este:
program Subsir_crec;
{Determinarea celui mai mare subsir crescator}
uses crt;
type vector=array[1..50] of integer;
var v,l:vector;
n,i,k,max,t:integer;
begin
clrscr;
write('Introdu numarul de elemente ale sirului V=');
readln(n);
for i:=1 to n do
begin
write('v[',i,']= ');
readln(v[i]);
end;
writeln('Sirul introdus este:');
for i:=1 to n do
write(v[i]:5);
writeln;
l[n]:=1;
for k:=n-1 downto 1 do
begin
max:=0;
for i:=k+1 to n do
if (v[i]>=v[k]) and (l[i]>max) then max:=l[i];
l[k]:=1+max;
end;
max:=l[1];
t:=1;
for k:=1 to n do
if l[k]>max then
begin
max:=l[k];
t:=k;
end;
writeln('Subsirul crescator de lungime maxima are ',max,' elemente:');
write(v[t]:5);
for i:=t+1 to n do
if (v[i]>v[t]) and (l[i]=(max-1)) then
begin
write(v[i]:5);
max:=max-1;
end;
readkey;
end.