結果

問題 No.45 回転寿司
ユーザー eseharaesehara
提出日時 2021-06-10 12:03:16
言語 OCaml
(5.1.0)
結果
AC  
実行時間 2 ms / 5,000 ms
コード長 1,332 bytes
コンパイル時間 1,954 ms
コンパイル使用メモリ 21,000 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-05-07 05:26:13
合計ジャッジ時間 3,127 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 2 ms
6,812 KB
testcase_02 AC 2 ms
6,944 KB
testcase_03 AC 2 ms
6,940 KB
testcase_04 AC 2 ms
6,940 KB
testcase_05 AC 2 ms
6,940 KB
testcase_06 AC 2 ms
6,940 KB
testcase_07 AC 2 ms
6,944 KB
testcase_08 AC 2 ms
6,940 KB
testcase_09 AC 2 ms
6,940 KB
testcase_10 AC 2 ms
6,948 KB
testcase_11 AC 2 ms
6,940 KB
testcase_12 AC 2 ms
6,948 KB
testcase_13 AC 2 ms
6,940 KB
testcase_14 AC 2 ms
6,940 KB
testcase_15 AC 2 ms
6,940 KB
testcase_16 AC 2 ms
6,940 KB
testcase_17 AC 2 ms
6,944 KB
testcase_18 AC 2 ms
6,940 KB
testcase_19 AC 2 ms
6,940 KB
testcase_20 AC 2 ms
6,940 KB
testcase_21 AC 2 ms
6,944 KB
testcase_22 AC 2 ms
6,944 KB
testcase_23 AC 2 ms
6,944 KB
testcase_24 AC 2 ms
6,940 KB
testcase_25 AC 2 ms
6,940 KB
testcase_26 AC 2 ms
6,940 KB
testcase_27 AC 2 ms
6,944 KB
testcase_28 AC 2 ms
6,940 KB
testcase_29 AC 2 ms
6,944 KB
testcase_30 AC 2 ms
6,940 KB
testcase_31 AC 2 ms
6,940 KB
testcase_32 AC 2 ms
6,940 KB
testcase_33 AC 2 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

module Cp : sig
  val string_1_list_of_string: string -> string list
  val split_on_char: char -> string -> string list
  val read_int_list: unit -> int list
end =
struct
  let string_1_list_of_string x =
    String.to_seq x
    |> List.of_seq
    |> List.map (String.make 1);;

  let split_on_char sep s =
    (* from OCaml Standard Library 4.12 *)
    let r = ref [] in
    let j = ref (String.length s) in
    for i = String.length s - 1 downto 0 do
      if String.unsafe_get s i = sep then begin
        r := String.sub s (i + 1) (!j - i - 1) :: !r;
        j := i
      end
    done;
    String.sub s 0 !j :: !r;;

  let read_int_list () =
    read_line () |> split_on_char ' ' |> List.map int_of_string;;
end

let memo_rec f =
  let h = Hashtbl.create 10000 in
  let rec g x =
    let try_find = Hashtbl.find_opt h x in
    match try_find with
    | Some (x) -> x
    | None ->
      let y = f g x in
      Hashtbl.add h x y ;
      y
  in
  g;;

let sushi_memo sushi_array =
  let rec fib self =
    fun x ->
      if x < 1 then 0
      else max ((self (x - 2)) + sushi_array.(x - 1)) (self (x - 1))
  in
  memo_rec fib;;

let () =
  let n = read_int () in
  let sushi_array = Cp.read_int_list () |> Array.of_list in
  let lets_sushi_party = sushi_memo sushi_array in
  lets_sushi_party n |> print_int;
  print_newline ();;
0