結果
問題 | No.417 チューリップバブル |
ユーザー |
|
提出日時 | 2024-05-25 02:20:26 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 1,509 bytes |
コンパイル時間 | 14,594 ms |
コンパイル使用メモリ | 378,728 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-12-20 19:33:26 |
合計ジャッジ時間 | 15,739 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 40 |
ソースコード
#![allow(non_snake_case)]use proconio::input;fn main() {input! {N: usize, M: usize,U: [i64; N],roads: [(usize, usize, usize); N - 1],}let mut graph = vec![vec![]; N];for &(u, v, w) in &roads {graph[u].push((v, w));graph[v].push((u, w));}// https://ngtkana.hatenablog.com/entry/2024/05/24/235658// dp[i] = i 時間以内に達成できる最大税収let mut dp = vec![std::i64::MIN; M + 1];dp[0] = 0;// dp 配列を `u` の部分木で更新する// - `dp`: DP 配列の初期値// - `u`: 見る頂点// - `p`: 親// - `cost`: p-u 間の時間fn dfs(M: usize, U: &[i64], graph: &[Vec<(usize, usize)>], dp: &mut [i64], u: usize, p: usize, cost: usize) {// `dp` にくわえて頂点 `u` を必ず納税するときの DP 配列let mut next = vec![std::i64::MIN; M + 1];for i in cost ..= M {next[i] = dp[i - cost] + U[u];}for &(v, w) in &graph[u] {if v == p {// 子ではないcontinue;}// next を更新dfs(M, U, graph, &mut next, v, u, w * 2);}// `dp` に頂点 `u` およびその部分木を使う場合の結果を反映するfor i in 0 ..= M {dp[i] = dp[i].max(next[i]);}}dfs(M, &U, &graph, &mut dp, 0, 0, 0);let ans = *dp.iter().max().unwrap();println!("{ans}");}