『アルゴリズムとデータ構造』を Rust で実装してみるシリーズ。5章の動的計画法。
必要なら proconio を cargo add しておく。
use proconio::input;
use std::cmp;
const INF: i64 = i64::MAX;
fn input(use_default_values: bool) -> (usize, Vec<i64>) {
if use_default_values {
let n: usize = 7;
let h: Vec<i64> = vec![2, 9, 4, 5, 1, 6, 10];
return (n, h);
} else {
println!("Input n and h:");
input! {
n: usize,
h: [i64; n],
}
return (n, h);
}
}
pub fn code_5_1(use_default_values: bool) -> i64 {
// 入力
let (n, h) = input(use_default_values);
// 配列 dp を定義 (配列全体を無限大を表す値に初期化)
let mut dp = vec![INF; n];
// 初期条件
dp[0] = 0;
// ループ
for i in 1..n {
if i == 1 {
dp[i] = (h[i] - h[i - 1]).abs()
} else {
dp[i] = cmp::min(
dp[i - 1] + (h[i] - h[i - 1]).abs(),
dp[i - 2] + (h[i] - h[i - 2]).abs(),
);
}
}
// 答え
return dp[n - 1];
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn code_5_1_works() {
let result = code_5_1(true);
assert_eq!(result, 8);
}
}
今回はここまで。
GitHub のリポジトリはこちら https://github.com/quantized-cube/book_algorithm_solution_rust
コメント