結果

問題 No.3114 0→1
ユーザー magurofly
提出日時 2025-04-19 00:05:45
言語 Rust
(1.83.0 + proconio)
結果
AC  
実行時間 3 ms / 2,000 ms
コード長 1,007 bytes
コンパイル時間 11,902 ms
コンパイル使用メモリ 403,716 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2025-04-19 00:05:59
合計ジャッジ時間 12,210 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

use proconio::{input, marker::Chars};

fn main() {
    input! {
        n: usize,
        s: Chars,
    }

    if n == 1 && s[0] == '0' {
        println!("1");
        return;
    }

    // 2桁前まで見る
    let mut dp = [1_000_000_000_i64; 4];
    dp[0b11] = 0;

    for i in 0 .. n {
        let mut dp_next = [1_000_000_000_i64; 4];
        for prev in 0b00 ..= 0b11 {
            for c in 0 ..= 1 {
                let mut cost = dp[prev];
                if (s[i], c) == ('0', 1) {
                    cost += 1;
                }
                let seq = prev << 1 | c;
                if seq & 3 == 0b00 {
                    continue;
                }
                if seq == 0b010 {
                    continue;
                }
                dp_next[seq & 3] = dp_next[seq & 3].min(cost);
            }
        }
        dp = dp_next;
    }

    let mut ans = 1_000_000_000_i64;
    for state in [0b01, 0b10, 0b11] {
        ans = ans.min(dp[state]);
    }

    println!("{ans}");
}
0