【題解】「NOIP2024模擬賽24 T2」子序列們
https://www.becoder.com.cn/contest/5715/problem/2
\(\mathcal{Description}\)
給定一個 0/1 串 \(a\),你需要生成一個長度為 \(n\) 的序列 \(b\),其中 \(b_i\) 為 \(a\) 的一個子序列,且滿足:
- \(|b_i|=n-i+1\);
- \(\forall i\in(1,n]\),\(b_{i}\) 是 \(b_{i-1}\) 的子序列。
求 \(b\) 本質不同的個數。
\(\mathcal{Solution}\)
題目其實就是要我們確定每個元素的刪去時間,這個時間是一個排列。
(當然,我們不能直接用 \(n!\) 然後去重,因為去重的時候仍涉及某個部分的方案數,所以不如直接面對本質不同的方案數。
考慮什麼時候會出現重複。
當存在兩個相同值的元素相鄰的時候就選其中一個和其她是完全相同的。
所以我們欽定,出現這種情況的是後必定先取前面的。
怎麼刻畫這件事情?
Motivation: 上面這種情況有可能在刪去某一個元素後新出現,比如 101 中刪去 0。
所以,我們考慮的因素應該包含:刪去時間、元素值。
設 \(i\) 的刪除時間為 \(t_i\)。
於是,我們欽定的要求也就等價於:對於一個 \(i\),\(j\) 是 \(i\) 左邊第一個 \(t_j>t_i\) 的元素,那麼需要滿足 \(a_j\ne a_i\)。
考慮 dp。
時間實際上是和 \(|b_i|\) 息息相關的,我們可以不用在狀態裡面考慮。
考慮區間 dp。
設:\(f_{i,j}\) 表示將 \([i,j]\) 刪除到只剩一個元素時,或者說確定了這個區間內所有元素的 \(t_i\),滿足 \(t_{j+1}>t_k,k\in[i,j]\)(將 \(t_{j+1}\) 換成 \(t_{i-1}\) 是等價的。
dp 轉移的時候需要滿足一些條件?那就在狀態裡面做手腳。
此時列舉,區間中最後被刪去的元素 \(k\),那麼她一定不能等於 \(a_{j+1}\),剩下就分成了完全獨立的兩個子區間。
那麼這樣就有轉移:(規定 \(a_{n+1}\ne 0/1\)