區間dp主要是把乙個大區間拆分成幾個小區間,先求小區間的最優值,然後合併起來求大區間的最優值,區間dp實際上就是經典dp的擴充內容,能從分割區間的思路上去解決問題。
一般區間dp實現**::
memset(dp, 0x3f, sizeof(dp));//將dp區間初始化;
for (int i = 1; i <= n; i++) //區間長度為1的初始化;
dp[i][i] = 0;
for (int len = 2; len <= n; len++) //列舉區間長度;
}
第一類:區間合併最值問題 首先,排除特殊案例,一堆或兩堆問題,一堆無花費,兩堆花費為兩堆之和;
其次,處理普通案例,多堆問題,由於只能對相鄰的進行處理,因此肯定是將相臨兩個取小的值然後繼續向後面進行重複的運算,對於經典dp肯定是乙個個向後面加而區間dp則是先將畫出乙個個小的空間再將空間內的進行這樣的運算,例如,講過的石堆合併:
for (int len = 2; len <= n; len++)}}
就是將【i】【j】區間劃分成【i】【k】和【k+1】【j】;
第二類:例如講過的符號分割問題 就是將整個區間看成是【i-1】【j】後面加乙個字元或者是【i+1】【j】前面加乙個字元。
如果a[i+1]到a[j]沒有和a[i]匹配的,
那麼dp[i][j] = dp[i+1][j]
如果a[k]和a[i]匹配(i < k <= j),那麼
dp[i][j] = max(dp[i][j], dp[i+1][k-1] + dp[k+1][j] + 2);
第三類:就是對區間的兩個端點進行處理,不再對整個區間進行分析,而是通過對端點的操作來進行整體的目標的實現。
最後,談一下我這段時間的看法吧,dp確實是比較好用的一種方法,尤其是dp延伸出的種種型別,能夠解決不同方面的複雜問題,可以肯定的是,相比較於貪心演算法來說解決的問題更多元化,我對於貪心來說感覺很好用,但是,貪心貪不好就會弄巧成拙,更多感覺是dp是對貪心貪不出來的問題的解決方式。
知識點整理
一 標準庫容器和演算法 1.順序容器 與前面類似 2.關聯容器 map和multimap 元素包含key 鍵 和值 value 兩部分 按照鍵對元素排序 map不允許重複元素出現,但multimap可以 set和multliset 是包含已排序物件的關聯容器 只是單純的鍵的集合 set不允許重複鍵出...
知識點整理
一 標準庫容器和演算法 1.順序容器 與前面類似 2.關聯容器 map和multimap 元素包含key 鍵 和值 value 兩部分 按照鍵對元素排序 map不允許重複元素出現,但multimap可以 set和multliset 是包含已排序物件的關聯容器 只是單純的鍵的集合 set不允許重複鍵出...
知識點整理
一 狀態控制碼 code,control flag 標誌位欄位 u a p r s f 佔6位元。各 位元的含義如下 ack 確認位元 acknowledge 只有當ack 1時確認號字段才有效,代表這個封包為確認封包。當ack 0時,確認號無效。psh push function 若為1時,代表要...