\(a.\)
首先有個樸素的動態規劃思路 , 記 \(f_\) 表示前 \(i\) 個位置 , 最後乙個位置的顏色是 \(j\) 的方案數。
轉移要用到容斥原理 , 用總方案數減去 \(j\) 連續出現 \(a_ + 1\) 次的方案數。 記 \(g_ = \sum}\)。 則 \(f_ = g_ - (g_ - 1} - f_ - 1 , j})\)。
注意到對於 \(a_\) 相同的顏色顯然狀態相同 , 可以分批轉移。 時間複雜度 : \(o(n ^ 2)\)
\(b.\)
二分答案 , 將每個數減去 \(x\) , 那麼要求的轉化為序列中總和大於 \(0\) 的區間個數。
這個問題可以用樹狀陣列等資料結構求解二維偏序得到。
但事實上可以不用資料結構 , 因為插入排序的時間複雜度是 \(o(逆序對個數)\) , 所以可以直接執行插入排序 , 如果超過 \(k\) 次交換操作就直接返回。
這樣的時間複雜度是 \(o(nlogn)\) 的。
附核心** :
記 \(dp_\) 表示考慮了前 \(i\) 個字串 , 乙個拼合串的字尾為 \(s_\) , 另乙個為 \(s_\) 的最短長度。
考慮優化 , 不妨將字串記進狀態 , 記 \(dp_\) 表示前 \(i\) 個字串 , 有乙個串字尾為 \(s_\) , 另乙個有乙個字尾是 \(s\) 的最短長度。
不妨建立字典樹儲存狀態。
這樣就有兩種狀態 :
第一種 , 接在上乙個串後面 , 這樣相當於給所有的狀態加上乙個數 , 可以直接在字典樹上打標記。
第二種 , 和某乙個串"縮"起來 , 這樣可以在字典樹上取 \(min\) 得到 , 對於這種情況 , 還需列舉當前串的乙個字尾更新樹上的節點。
時間複雜度 : \(o(nm)\)
程式設計第十八題
rpg girls今天和大家一起去遊樂場玩,終於可以坐上夢寐以求的過山車了。可是,過山車的每一排只有兩個座位,而且還有條不成文的規矩,就是每個女生必須找個個男生做partner和她同坐。但是,每個女孩都有各自的想法,舉個例子把,rabbit只願意和xhd或pqk做partner,grass只願意和l...
100題 第十八題(約瑟夫迴圈)
一,題目 n個數字 0,1,n 1 形成乙個圓圈,從數字0開始,每次從這個圓圈中刪除第m個數字 第乙個為當前數字本身,第二個為當前數字的下乙個數字 當乙個數字刪除後,從被刪除數字的下乙個繼續刪除第m個數字。求出在這個圓圈中剩下的最後乙個數字。三,原始碼 include include malloc....
dp專題 第十八題 買書
1 簡單描述 小明手裡有n元錢全部用來買書,書的 為10元,20元,50元,100元。有多少種買書的方案。注意 n元錢必須全部用來買書,每種書的數目不限。2 思路 完全揹包問題 include using namespace std int v 10 int f 1010 i,j,n intmain...