DP經典問題 WordBreak

2021-06-20 05:21:27 字數 1336 閱讀 1858

這個題解法很多,順便理一下思路

dp幾步走:

1. 寫狀態轉移方程,根據方程就可以得到基本dp方法,注意時間複雜度和空間複雜度的計算。

2.很多dp劃分方式很多,所以注意使用記憶搜尋來優化dp的處理速度。

3. 事實上使用dp遞迴呼叫仍然使用了大量的儲存空間,使用dp自底向上可以實現o(1)儲存的實現,但往往那個稍顯困難。

word break這題接法很多,最笨的接法是直接dp,

解法1: 直接dp.

既然要把乙個string s轉化為多個單詞的組合,可以從頭向尾匹配乙個乙個字元匹配,即(參考wordbreaks2)

solve(int start)

但這有問題,dict裡面出現a,aa,aaa,aaaa絕對超時,因為會重複查詢,因此為了避免重複計算,最常用的方法就是記憶搜尋。用陣列儲存中間結果。

解法2:記憶搜尋+dp res存結果 0為沒存結果,-1為false,1為正確,其實1不用存。

320ms過大集合

setsset;

string st;

int res;

private boolean dp1(int start)

boolean success=false;

for(int i=st.length();i>=start+1;i--)

else

success=dp1(i);

}if(success)

} res[start]=-1;

return false;

}public boolean wordbreak(string s, setss)

這就是我的能力極限了,最近看到很多大牛談到bottom up的dp,很是神往,參考了一些資料。

順便比較一下神寫的**和渣寫的**

public class solution 

public boolean wordbreakhelper(string s, setdict, int start)

return false;

}}

解法3:神**  似乎還是記憶搜尋

public class solution }}

return t[s.length()];

}}

這個方法實際還是dp的記憶搜尋,從頭節點開始遍歷,能走到的點標記true,看看尾節點能不能標記true。一定要注意,處理這種單詞型別的時候一定要想好遍歷的基本單位是什麼,到底是乙個乙個字元走,還是乙個乙個單詞走。想清楚,才能走的更快

經典DP問題

動態規劃5個經典問題解析 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和為20。數塔問題 要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?include s...

郵局 dp經典問題

題目 題意 一些村莊被建立在一條筆直的高速公路邊上,我們用一條座標軸來描述這條高速公路,每乙個村莊的座標都是整數,沒 有兩個村莊座標相同。兩個村莊間的距離,定義為它們的座標值差的絕對值。我們需要在一些村莊建立郵局 當然,並不是每 乙個村莊都必須建立郵局,郵局必須被建立在村莊裡,因此它的座標和它所在的...

區間dp(經典問題)

所謂區間dp,顧名思義就是在一段區間上的動態規劃。它既要滿足dp問題的最優子結構和無後效性外,還應該符合在區間上操作的特點。我的理解是往往會對區間進行合併操作。抑或是單個元素 可看成乙個小區間 跨區間進行操作。例如括號匹配問題,石子合併問題 通過多次的相鄰合併,最後實質上會產生跨區間的合併,如果你把...