Advertisement
Guest User

segmenty fib

a guest
Jan 19th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.82 KB | None | 0 0
  1. let exampletab = [|4;2;1;2;3;5;2;8;7|]
  2. let ex2 = [|5;8;13;21|]
  3. (* znajdz maksa w tablicy *)
  4. let m tab =
  5.         let top = ref 0 in
  6.         let len = Array.length tab in
  7.         begin
  8.                 for i = 0 to len - 1 do
  9.                         if tab.(i) > !top then top := tab.(i);
  10.                 done;
  11.         end;!top
  12.  
  13. (* zmapuj elementy tablicy na ich indeks w ciagu fib, -1 w przeciwnym przypadku
  14.  * 1 moze miec wartosci 1 lub 2, ale dostaje tutaj 2 *)
  15. let rzad tab maxi =      
  16.         let h = Hashtbl.create 0 in
  17.         let len = Array.length tab in
  18.         let a = ref 1 in
  19.         let b = ref 1 in
  20.         let i = ref 1 in
  21.         begin
  22.                 while !a <= maxi do
  23.                         Hashtbl.add h !a !i;
  24.                         b := !b + !a;
  25.                         a := !b - !a;
  26.                         i := !i + 1;
  27.                 done;
  28.                 for i = 0 to len - 1 do
  29.                         match Hashtbl.find_opt h tab.(i) with
  30.                         | None -> tab.(i) <- (-1)
  31.                         | Some x -> tab.(i) <- x
  32.                 done;
  33.         end;
  34.         tab
  35.  
  36. (* laczy dwa segmenty fib o rzedach a,b i zwraca wartosc tego segmentu polaczanego
  37.  * obsluguje przypadek kiedy a=2 i b=2 (bo mamy wtedy dwie jedynki obok siebie czyli mozna zrobic z tego segment mocy 3) *)
  38. let polaczrzedy a b =
  39.         if (a<0) || (b<0) then (-1)
  40.         else if (a = 2) && (b = 2) then 3
  41.         else if a = (b+1) then (a+1)
  42.         else if b = (a+1) then (b+1)
  43.         else (-1)
  44.  
  45. let segment tab =
  46.         let maxi = m tab in
  47.         let rzadtab = rzad tab maxi in
  48.         let len = Array.length tab in
  49.         let dp = Array.make_matrix len len (-1) in
  50.         let max_wynik = ref (-1) in
  51.         let rembmax = ref (-1) in
  52.         begin
  53.                 (* wypelnianie przekatnej *)
  54.                 for i = 0 to len - 1 do
  55.                         dp.(i).(i) <- rzadtab.(i);
  56.                         max_wynik := max !max_wynik rzadtab.(i);
  57.                 done;
  58.                 (* wypelnianie reszty tablicy dp od dolu po kolejnych wierszach *)
  59.                 (* wybranie wiersza *)
  60.                 for i = len - 2 downto 0 do
  61.                         (* wybierz komorki w wierszu do wypelnienia *)
  62.                         for j = i + 1 to len - 1 do
  63.                                 rembmax := (-1);
  64.                                 (* wybierz maksa z wszystkich mozliwych kombinacji *)
  65.                                 for k = i to j-1 do
  66.                                         rembmax := max !rembmax (polaczrzedy (dp.(i).(k)) (dp.(k+1).(j)))
  67.                                 done;
  68.                                 dp.(i).(j) <- !rembmax;
  69.                                 max_wynik := max !max_wynik !rembmax;
  70.                         done;
  71.                 done;
  72.         end;!max_wynik
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement