AtCoder 🟢 AT_dp_q Flowers
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
🔗 🟢 AT_dp_q Flowers
Problem Statement
題目簡述
有 朵花排成一列,第 朵花高度為 (兩兩互異),美麗值為 。現需移除若干花,使剩餘花從左到右高度嚴格遞增,求剩餘花美麗值總和的最大值。
Constraints
約束條件
- ,且 兩兩不同
思路:線段樹優化 DP
本題是 帶權 LIS(Longest Increasing Subsequence) 的變種。我們不再追求子序列長度最長,而是選取一個高度嚴格遞增的子序列,使美麗值總和最大化。
DP 定義
設 表示「以高度恰好為 的花作為子序列結尾時,所能達成的最大美麗值總和」。
對於按原始順序從左到右掃描到的第 朵花(高度 、美麗值 ),其轉移為:
關鍵觀察
由於花的高度 兩兩互異且 ,可直接以高度值作為線段樹的索引,無需離散化。
正確性
從左到右掃描時,線段樹僅含位置 的花。查詢 自動滿足「位置靠左 ∧ 高度較小」的雙重限制。
線段樹優化
樸素 DP 需要 時間查詢前綴最大值,總複雜度 無法接受。
使用 單點修改、區間最大值查詢 的線段樹,可將每次轉移優化至 :
seg.prod(0, h):查詢高度 的所有花中,已累積的最大美麗值(前綴 的最大值)seg.set(h, val):更新以高度 結尾的最佳結果
最終答案為 seg.all_prod(),即所有狀態的最大值。
複雜度分析
- 時間複雜度:
- 空間複雜度:
Code
1 | from atcoder.segtree import SegTree |
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus

















