[JSOI2016]無界單詞[動態規劃、kmp]
題意
題目鏈接
分析
對於第一問,枚舉最終串最小的相同前後綴來統計答案。
由於最小的相同前後綴也是無界單詞,所以可以考慮先求解子問題。
定義狀態 \(f(i)\) 表示長度為 \(i\) 的串中有多少個是無界單詞。
補集轉化後容易得到:
\[f_i=2^i-\sum\limits_{i=1}^{\left\lfloor\frac{i}{2}\right\rfloor}f_j\times2^{i-2j}?\]
對於第二問,按位確定答案。每次在前 \(len\) 位確定的情況下重新算 \(f\) 。
- 如果 \(i\le len\) :此時求出 \(next\) 數組判斷。
- 否則,如果 \(j>len\)
- 如果 \(j \le len\) 且 \(len\le n - j\) : 貢獻為 \(f_j\times 2^{i-len-j}\)
- 如果 \(j\le len\) 且 \(len > n - j\):要滿足 \(s[1\cdots len-i+j]=s[i-j+1\cdots len]\) 且 \(f_j\) 為1。
代碼
代碼鏈接
[JSOI2016]無界單詞[動態規劃、kmp]
相關推薦
[JSOI2016]無界單詞[動態規劃、kmp]
left 單詞 由於 貢獻 ext line loj 統計 枚舉 題意 題目鏈接 分析 對於第一問,枚舉最終串最小的相同前後綴來統計答案。 由於最小的相同前後綴也是無界單詞,所以可以考慮先求解子問題。 定義狀態 \(f(i)\) 表示長度為 \(i\) 的串中有多少個是無
【LOJ】#2078. 「JSOI2016」無界單詞
前綴 clu next 枚舉 時長 next數組 第k大 方案 遞推 ### 題解 用所有的方案減去有界的方案 我們規定兩個前綴後綴相同時長度最短的,設長度為l,因為長度最短所以他們也是無界單詞,可以遞推 $f[i] = \sum_{j = 1}^{\lfloor \f
Leetcode 96 95 不同的二叉搜尋樹(動態規劃、搜尋樹) 不同的二叉搜尋樹II (遞迴、搜尋樹)
1.不同的二叉搜尋樹 給定一個整數 n,求以 1 … n 為節點組成的二叉搜尋樹有多少種? 示例: 輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹: 1 3 3 2 1 \
Codeforces 946F Fibonacci String Subsequences - 動態規劃 - 矩陣 - kmp
題目傳送門 傳送門I 傳送門II 傳送門III 題目大意 定義 F[0] = "0", F[1] = "1" ,以及當$n >1$時有 F[n] = F[n - 1] + F[n - 2] ,其中加號表示字串連線。
常用資料結構思維:分治、動態規劃、貪心、回溯、分支限界
分治:把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併 http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html#30
六中常用演算法設計:窮舉法、分治法、動態規劃、貪心法、回溯法和分支限界法
演算法設計之六種常用演算法設計方法 1.直接遍歷態(窮舉法) 程式執行狀態是可以遍歷的,遍歷演算法執行每一個狀態,最終會找到一個最優的可行解;適用於解決極小規模或者複雜度線性增長,而線
POJ 1088 滑雪 (記憶化、動態規劃、排序優化)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 108063 Accepted: 41157 Description Michael喜歡滑雪百這並不奇怪, 因為
Leetcode 96:不同的二叉搜尋樹 (動態規劃、搜尋樹)
給定一個整數 n,求以 1 … n 為節點組成的二叉搜尋樹有多少種? 示例: 輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹: 1 3 3 2 1 \
LeetCode-131.分割回文串(相關話題:動態規劃、深度優先)
給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 所有可能的分割方案。 示例: 輸入: "aab" 輸出: [ ["aa","b"], ["a","a","b"] ] 思路: 動態規劃判s[i~j]是否為迴文串 深度優先搜尋所
動態規劃、記憶化搜尋、Dijkstra演算法的總結
動態規劃 動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得
leetcode:貪心、動態規劃、記憶化搜尋
貪心的基本概念 所謂貪心演算法,是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。 貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演
刷題記錄[SDOI2009]HH去散步(動態規劃、矩陣快速乘、點邊互換思想)
連結https://www.luogu.org/problemnew/show/P2151 題目描述 HH有個一成不變的習慣,喜歡飯後百步走。所謂百步走,就是散步,就是在一定的時間 內,走過一定的距離。 但是同時HH又是個喜歡變化的人,所以他不會立刻沿著剛剛走來的路走回。 又因為HH是個
LeetCode 10. Regular Expression Matching python特性、動態規劃、遞迴
前言 本文主要提供三種不同的解法,分別是利用python的特性、動態規劃、遞迴方法解決這個問題 使用python正則屬性 import re class Solution2: # @return a boolean def isM
整數劃分問題---動態規劃、遞迴
第一: 將一個整數 n 劃分為 不超過m 組 的劃分數 如 n=4 m=3 輸出: 4 { 1+1+2=1+3=2+2=4} 思路:使用動態規劃: 定義狀態: dp[i][j] j的i劃分的組數 遞推:dp[i][j]=dp[i][j-i]+dp[i-1][j] ----
斐波那契數列3種解法(樸素遞迴、動態規劃、數學歸納)及演算法分析
本文來自網易公開課的<演算法導論>第3講分治法。讓我對分治法的使用有了一個新的認識斐波那契數列,又稱黃金分割數列,F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 下面我將使用Java(是的,又是Java,不過我覺得沒什麼問題,演
MIT演算法導論公開課之第15課 動態規劃、最長公共子序列
動態規劃(Dynamic programming) 動態規劃是一種設計技巧,而不是一種特定的演算法,就像分治法一樣。 最長公共子序列(Longest common subsequence)問題 有兩個序列,序列x[1~m],序列y[1~n],找到它們的最長
五大演算法比較-分治、動態規劃、回溯、分支限界、貪心演算法
分治演算法 一、基本概念 在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法(快速排
動態規劃、貪心、回溯、分支限界法解0-1揹包問題總結
本文通過0-1揹包問題的不同解法,深入理解計算機常用演算法動態規劃、貪心、回溯、分支限界法的思想。 問題描述 0-1揹包問題:給定n種物品和一揹包。物品i的重量是wi,其價值是vi,揹包的容量為C。問:應該如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值
演算法設計之—直接 遍歷/窮舉法、貪心演算法、動態規劃、回溯法
演算法是對完成特定問題的程式執行序列描述,表象為從問題初始狀態到問題結束狀態的所有路徑之中尋找可行路徑,若無先驗經驗,根據執行方式不同可以劃分為無規則和有規則(啟發式)方法。 無規則方法為窮舉,改進方法為遞推和迭代;有規則方法有分治、貪心、動態規劃、
動態規劃、分治法與貪心演算法的區別
分治法與動態規劃的相同點: 分治法與動態規劃,二者要求原問題具有最有子結構,都是將問題分而治之分解成若干個規模較小的子問題; 不同點:動態規劃是將原問題分解為多個子問題,通過計算出子問題的結果構造一個最優解。動態規劃通過迭代法自底向上求解,動態規劃將分解後的子問題理解為相互