(1) 可以將大問題分解,分解後的問題容易解決
(2) 分解後的子問題是同一種類,並且具有最優子結構性質(下面會解釋)
(3)分解後的子問題解決後可以合併
(4)分解後的子問題沒有公共問題(dp可以解決)
ps:最優子結構:區域性最優解是全域性最優解的一部分,即當前的狀態是最優的,與後面的決策沒關係(同動態規劃與貪心)
以上條件都滿足,就可以用分治啦
分治,字面上的解釋是「分而治之」,就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解。
隨意看一下就好了
(1)分解為許多子問題
(2)解決子問題
(3)解決合併問題
題意:已知n個數,求第k大數。
如果用sort從大到小排序再二分時間複雜度為o(nlogn)
但是如果用歸併排序為o(n),而且剪短
原理:每次取劃分後的序列中的第乙個數x,將序列劃分為2個集合,
比較大小
(1)如果中的元素個數為k-1個,則x為第k個數
(2)如果中的元素個數為大於k-1個,x比所求小,第k大數在集合中,繼續劃分集合。
(3)如果中的元素個數為小於k-1個,x比所求大,第k大數在集合中,繼續劃分集合。
下面看**及注釋
#includeusing namespace std;
int a[ ];
int find(int l, int r)
a[l] = tmp;
return l;
}//求比x小的集合個數
int ask(int l, int r, int k)
int main()
我仔細看了一下,其他的題都是利用分治優化,但大多都沒有什麼影響,**還長,其精華主要在於它的思考方式,上面的題是乙個典型的例子,希望讀者好好領會,以及究竟是怎麼找比x小的數,幾次賦值十分精彩
祝大家前途似海,來日方長
雙指標演算法以及一些典型例題
一 雙指標演算法兩種常見的問題分類 1 對於兩個序列,維護某種次序,比如歸併中合併兩個有序序列的操作 2 對於乙個序列,用兩個指標維護一段區間 注意,這裡雖然說雙指標,但不代表是真正的兩個指標,你可以理解為兩個變數i,j 但是這兩個變數i,j它們是一直向前行進的,是不會後退,就拿kmp來說,其實它也...
基礎演算法例題(遞迴 分治 )
遞迴 include include includeusing namespace std void comp int arr,int l,int r,int max1,int max2 else if r l 1 else else int main printf n comp a,0,n 1,m...
數論的典型例題
1 本原勾股數 概念 乙個三元組 a,b,c 其中a,b,c沒有公因數而且滿足 a 2 b 2 c 2 首先,這種本原勾股數的個數是無限的,而且構造的條件滿足 a s t,b s 2 t 2 2,c s 2 t 2 2 其中s t 1是任意沒有公因數的奇數!由以上概念就可以匯出任意乙個本原勾股陣列。...