2023-04-27 PAST #1 I を解いた
- PAST #1 I - 部品調達 (第一回 アルゴリズム実技検定 I 問題)
https://atcoder.jp/contests/past201912-open/tasks/past201912_i
- https://atcoder.jp/contests/past201912-open/submissions/40981119
- bitDP
- 部品の種類 N は
N <= 10
と小さいので部品の入手状況は2^10
個で表現できる dp[i][j] := i 番目までのセットで j の部品の入手状況のときの最小の金額
とおくdp[0][0]
を0
に、それ以外の初期値をINF
にする- 1 セットずつ買う場合・買わない場合の遷移を、すべての部品の入手状況ごとに試す
- 答えは
dp[M][(1 << N) - 1]
にある INF
のときは忘れずに-1
にする
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,
m: usize,
sc: [(Chars, usize); m],
}
let mut tc = vec![];
for (s, c) in sc {
let mut t = 0_usize;
for i in 0..n {
if s[i] == 'Y' {
t |= 1 << (n - i - 1);
}
}
tc.push((t, c));
}
let inf = 1_usize << 60;
let mut dp = vec![vec![inf; 1 << n]; m + 1];
dp[0][0] = 0_usize;
for (i, (t, c)) in tc.iter().copied().enumerate() {
for bits in 0..1 << n {
chmin!(dp[i + 1][bits], dp[i][bits]);
chmin!(dp[i + 1][bits | t], dp[i][bits] + c);
}
}
let ans = dp[m][(1 << n) - 1];
println!("{}", if ans == inf { -1 } else { ans as i64 });
}
『介護の現場と業界のしくみ』にざっと目を通した。
Hades 。剣のアーサーの態でクリア。 7 周目。難易度を上げそびれた。
今日のコミット。
- tsukota 2 commits
- rust-atcoder 1 commit