https://projecteuler.net/problem=67
単なるDPですね。
import sys #################### library #################### fn read_csv(path: String, delim: String) -> List[List[Int]]: try: var table = List[List[Int]]() with open(path, "r") as f: var all_text = f.read() var lines = all_text.split('\n') for line in lines: if len(line[]) == 0: break var v = line[].split(delim) var ns = List[Int]() for s in v: var n = atol(s[]) ns.append(n) table.append(ns) return table except: return List[List[Int]]() #################### List #################### fn initialize_list[T: CollectionElement](N: Int, init: T) -> List[T]: var a = List[T](capacity=N) for n in range(N): a.append(init) return a trait Printable(CollectionElement, Stringable): pass fn print_list[T: Printable](a: List[T]): if a.size > 0: var s = "[" + str(a[0]) for i in range(1, a.size): s += ", " + str(a[i]) s += "]" print(s) else: print("[]") fn max_list[T: ComparableCollectionElement](a: List[T]) -> T: var max_elem = a[0] for i in range(1, len(a)): if a[i] > max_elem: max_elem = a[i] return max_elem #################### process #################### fn update_dp(dp: List[Int], v: List[Int]) -> List[Int]: var L = len(v) var new_dp = List[Int](dp[0] + v[0]) for i in range(1, L-1): new_dp.append(max(dp[i-1], dp[i]) + v[i]) new_dp.append(dp[L-2] + v[L-1]) return new_dp fn f(path: String) -> Int: var triangle = read_csv(path, ' ') var H = len(triangle) var dp = List[Int](triangle[0][0]) for i in range(1, H): dp = update_dp(dp, triangle[i]) return max_list(dp) fn main(): var args = sys.argv() var path = args[1] print(f(path))