7 23學習心得 遞迴 二分

2021-09-25 12:22:31 字數 2534 閱讀 7792

今晚題目做不出來,心態**ing。一直超時,最討厭優化了!!還有乙個題看也看不懂,現在也不想思考了,嗚嗚嗚,藍瘦,好想看答案,還是抑制住了我的思想,啊,這種情況下果然腦子裡面都是「你這麼菜在這裡丟什麼人」之類的呢,心情沉重。畢竟他們彷彿都會但是我停止了思考~~就讓我安靜的做一條鹹魚(怎麼可能啊喂!不過真的好渴望做一條鹹魚呢!)

看了題解之後:

那個一直超時的題,應該是先用函式找出所有的因數(而不是乙個個遍歷……嗚嗚),然後再判斷因數是不是有重複數字就可以。

c題看起來很難,其實看懂了這個遞迴方程就很好理解了,因為只有乙個遞迴的線路,所以只能迴圈一次,就到了遞迴的終止,而且從乙個例子來看,經過一次遞迴,第乙個數會到最後,其餘的數字不變,所以要想結果是可以遞增的,就是要把最大的放前面,然後其他的遞增輸出即可。

哎,心態**ing,不想說話。不想做題。

今天本來想再交一交試試能不能過,結果編譯錯誤……都能執行出答案你跟我講編譯錯誤??

對於某個數列a,它的字首和數列s是通過遞推得到的資訊之一,往往在開始做題的時候,就可以利用a[i]求出對應的s[i]。部分和,即數列a從l->r這一部分的和,可以表示為對應的s之差:sum[l,r]=s[r]-s[l-1]。

二維矩陣中,也是類似的推導過程。

a[i][j]=s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r](最後這一項是因為在減去前兩項時,多剪了一次左上角的區域,得到的a[i][j]變小了。

這個遞迴看的!遇上了跟沒遇見過一樣!

以原問題為起點,嘗試把狀態空間縮小到已知的「問題邊界」的路線,再通過這條路線反向回溯的遍歷方式就是遞迴。即,由問題找路線(可以發現答案的路線),直到定義域的邊界處,再由這個路線原路返回,並帶回答案。

考慮問題發現可以遞迴後,可以用以下步驟來寫出遞迴方程:

1.嘗試縮小狀態空間(由大問題化解為小問題)。

2.求解這個小問題,由結果看縮小的成功與否。

3.由小問題返回到大問題,答案拓展。

例題:

(1)1~n之中隨機選取任意個數字,輸出所有可能的求解方案

答:縮小為數字1、2中選擇,發現任意乙個數字有兩條路徑:選與不選。從1到2,選1也選2、選1不選2、不選1選2、不選1不選2,這四種答案,問題邊界:選完第二個數。所以由此可知,在1~n中,每乙個數都可以有選與不選兩個遞迴路線,邊界,遞迴的次數(已選過的數字的個數)>n。

返回過程:從1->n,每個數字都是選與不選,每次的選擇都會有不一樣的路徑,不一樣的可能,到n就輸出。

(2)1~n全排列輸出

答:縮小為1、2、3全排列。for(1~3)中,第一次迴圈選1,標記1已經選過一次,第二次依舊是1~3的迴圈,在沒有被標記的數字中選下乙個數字,直到選完所有的數字。同理,擴大之後也是這樣的選擇路徑方法。

邊界條件:已經選了n個數字。

注意:

1.區域性變數不能太多,防止棧溢位。

2.非區域性變數所有遞迴共有,必須進行現場還原,否則影響各層遞迴的資料。

二分基礎應用:在單調函式、單調佇列之中進行查詢,三分還能進行求峰值的問題。

二分有整數域和實數域兩種

(1)整數域

參考書的二分寫法保證答案在閉區間[l,r]中,迴圈當l==r時結束,每次二分mid都會劃分於左半部分或者右半部分。

①結果屬於》=某個數值(x)中的最小值時(要麼是x本身,要麼沒有x時取大於x的第乙個數字),相當於找滿足條件的這個區間的最左邊部分,如此看來,mid>x的部分可以捨去(所求在最左邊),r=mid-1。相反,若找<=x的最大值,則捨去左半邊,l=mid+1。

②mid=(l+r)/2  永遠取不到r,所以這個mid用於捨棄右邊部分,求最小值。

mid=(l+1+r)/2  永遠取不到l,捨棄左半部分,求最大值。

③終止條件:l==r。

(2)實數域

有小數,所以l==r不怎麼可能成立。

所以while()條件要變換:l+1e-5其餘部分一樣。

乙個最優化問題也可以抽象為函式,不過這一次的解,由我們自己設定邊界,求得滿足條件且在邊界周圍的最優化解。

假設最優評分是mid,那麼對於》mid的,現然不可能達到該評分,對於例子:

n本書排成一排,第i本書的厚度是ai,把他們分成連續的m組,使厚度之和最大的一組在所有分組情況中最小。

思考:

假設最優厚度是mid,那麼每次都減去一本書的厚度,看看以這個大小為邊界,可以分成幾組,因為要求最小值,舍右。如果恰好分成<=m組了,則r=mid看看還能不能更小,不能分成m組的話,說明這個厚度界限太大,l=mid+1,要將厚度的最優變得大一點。

有唯一的極大值點,或唯一的極小值點。

f(x)在定義域[l,r]上取lmid、rmid。(lmid(1)如果f(lmid)則,無論rmid在那一邊,lmid必須始終在左邊,由此得知,極值點橫座標一定大於lmid,則l=limd。

(2)如果f(lmid)>f(rmid)

同理,無論lmid在左在右,rmid始終在右,極值點一定在左邊,所以r=rmid。

ExtJS學習心得(二)

其實ext.ajax的使用並不難,只是當初我一直不清楚如何獲取其返回值,搞得鬱悶了一陣子,以下是乙個比較簡單的例子 view plain copy to clipboard print?1ext.ajax.request 8 success function response,options 14 ...

ExtJS學習心得(二)

其實ext.ajax的使用並不難,只是當初我一直不清楚如何獲取其返回值,搞得鬱悶了一陣子,以下是乙個比較簡單的例子 1ext.ajax.request 8success function response,options 14else17 18 說明 2行 url引數是要提交到的頁面 3行 para...

filter學習心得(二)

1.只要不執行chain.dofilter就不會執行後面的請求內容,而在實際中,就要特別注意執行的順序問題 2.過濾器的作用 在httpservletrequest 到達servlet 之前,攔截客戶的httpservletrequest 根據需要檢查httpservletrequest 也可以修改...