概要
DPの問題です。慣れたものだね。
use itertools::iproduct;
use proconio::input;
fn main() {
input! {
: usize,
nmut dcs: [(usize, usize, usize); n],
}
// 締切日を降順にソート
.sort_by(|a, b| a.0.cmp(&b.0).then(a.1.cmp(&b.1)).then(b.2.cmp(&a.2)));
dcs
// dp[i][j]: i問題目まで考えて、それまでの合計仕事日数がjの時の、報酬の最大値
let mut dp = vec![vec![0; 5001]; n + 1];
for (i, j) in iproduct!(0..n, 0..5001) {
// i問題目を解く場合
if j + dcs[i].1 <= dcs[i].0 {
+ 1][j + dcs[i].1] = dp[i + 1][j + dcs[i].1].max(dp[i][j] + dcs[i].2);
dp[i }
// i問題目を解かない場合
+ 1][j] = dp[i + 1][j].max(dp[i][j]);
dp[i }
println!("{}", dp[n].iter().max().unwrap());
}