jasio1906

Fibbonaci

Jan 16th, 2020
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.54 KB | None | 0 0
  1. open Hashtbl
  2.  
  3. let fib n=
  4.         let wynik = Hashtbl.create n in
  5.         let rec pom a b k =
  6.                 if k<=n then
  7.                         begin
  8.                                 Hashtbl.add wynik b k;
  9.                                 pom b (a+b) (k+1);
  10.                         end;
  11.         in
  12.         begin
  13.                 Hashtbl.add wynik 1 1;
  14.                 pom 1 1 2;
  15.         end;
  16.         wynik
  17. let abs x =
  18.         if x<0 then -x
  19.         else x
  20.  
  21. let pred a b =
  22.         if abs(a-b)=1 then true
  23.         else if(a=2) then if abs(1-b)=1 then true
  24.                           else false
  25.         else if(b=2) then if abs(1-a)=1 then true
  26.                           else false
  27.         else false
  28.  
  29. let decision a b = if pred a b then max a b +1
  30.                    else -1
  31.  
  32. let segment tab =
  33.         let maxi = ref 0 in
  34.         let n = Array.length tab in
  35.         let fibtab = fib n in
  36.         let dp = Array.make_matrix n n 0 in
  37.         for i = 0 to (n-1) do
  38.                 let w = Hashtbl.find_opt fibtab tab.(i) in
  39.                 match w with
  40.                 |None -> (dp.(i).(i) <- (-1);)
  41.                 |Some w -> (dp.(i).(i) <- (w);)
  42.         done;
  43.         for x = 1 to n-1
  44.         do      
  45.                 for i=0 to n-1-x
  46.                 do
  47.                         dp.(i).(i+x) <- decision dp.(i).(i+x-1) dp.(i+x).(i+x) ;
  48.                         let cur = dp.(i).(i+x) in
  49.                         if cur > !maxi then maxi:= cur;
  50.                 done;
  51.         done;
  52.  
  53.         !maxi
Add Comment
Please, Sign In to add comment