2023-06-06 家庭保育で休み / PAST #2 K を解いた
家庭保育のために休んだ。熱が出ると 24 時間登園できないので発熱した日の翌日も休ませないといけないルールになっている。元気いっぱいの子どもを世話するのは仕事よりも疲れるが、有給休暇だ。こうやって休暇が消えていく。
bouzuya/tsukota のアカウント共有機能の実装を進めている。 Firestore からデータは得られるのだけどせっかくなのでスマホ同士で共有している感がほしいので。
- 括弧 (第二回 アルゴリズム実技検定:K問題)
https://atcoder.jp/contests/past202004-open/tasks/past202004_k
- https://atcoder.jp/contests/past202004-open/submissions/42038657
 - DP
 (があれば)を使った遷移ができる (閉じ括弧は対応が取れる遷移しかしない)(の数ごとの最小コストを保持しておき、最後の文字まできた時点で(がゼロのところの最小コストが答えになる (開き括弧の対応が取れていないものを回避できる)
 
use proconio::{input, marker::Chars};
macro_rules! chmin {
    ($min_v: expr, $v: expr) => {
        if $v < $min_v {
            $min_v = $v;
            true
        } else {
            false
        }
    };
}
fn main() {
    input! {
        n: usize,
        s: Chars,
        c: [usize; n],
        d: [usize; n]
    }
    let inf = 1_usize << 60;
    let mut dp = vec![inf; n + 1];
    dp[0] = 0_usize;
    for (i, s_i) in s.iter().copied().enumerate() {
        let mut next = vec![inf; n + 1];
        for j in 0..=n {
            match s_i {
                '(' => {
                    if j + 1 <= n {
                        chmin!(next[j + 1], dp[j]);
                    }
                    if j > 0 {
                        chmin!(next[j - 1], dp[j] + c[i]);
                    }
                    chmin!(next[j], dp[j] + d[i]);
                }
                ')' => {
                    if j > 0 {
                        chmin!(next[j - 1], dp[j]);
                    }
                    if j + 1 <= n {
                        chmin!(next[j + 1], dp[j] + c[i]);
                    }
                    chmin!(next[j], dp[j] + d[i]);
                }
                _ => unreachable!(),
            }
        }
        dp = next;
    }
    let ans = dp[0];
    println!("{}", ans);
}
今日のコミット。