AWC0001β D - 街道の商人

なんか久々なせいか計算量解析がガバガバだったのでメモ。
問題概要
正整数と長さの数列が与えられます。の連続するとは限らない部分列であって、以下の条件を満たす物のうちの最大値を求めてください。
- について、
解法
どう見てもDPなのでDPテーブルを考える。が最大で200と小さいので、そこまでのBの和を持っておくのが自然。 条件を満たす列であって最後にを使い、の和がであるような列のうちの和としてあり得る最大値、とするDPをすればよい。
空間は。遷移は、へと遷移可能なのはについての通りしか無いのでで良い。全体でで、余裕を持って通る。
use library::utils::{chlibs::ChLibs, input::Input, iterlibs::collect::CollectIter};
fn solve(ip: &mut Input) {
let (n, m) = ip.pair::<usize>();
let k = ip.next::<usize>();
let v = (0..n)
.map(|_| (ip.next::<i64>(), ip.next::<usize>()))
.collect_vec();
let mut dp = vec![vec![0i64; m + 1]; n];
for (i, &(a, b)) in v.iter().enumerate() {
let mut mn = vec![0; m + 1];
for j in if i < k { 0 } else { i - k }..i {
for l in 0..=m {
mn[l].chmax(dp[j][l]);
}
}
for c in 0..m {
if c + b <= m {
dp[i][c + b].chmax(mn[c] + a);
} else {
break;
}
}
}
println!("{}", dp.iter().flatten().max().unwrap());
}
自省用にアホのメモをペタリ
