史上最容易理解的暴力递归和动态规划~~
????????????
????????史上最容易理解的暴力遞歸和動態規劃~~????介紹遞歸和動態規劃
1, 把問題轉化為規模縮小了的同類問題的子問題
2, 有明確的不需要繼續進行遞歸的條件(base case)
3, 有當得到了子問題的結果之后的決策過程
4, 不記錄每一個子問題的解(區別于動態規劃2)
1, 從暴力遞歸中來
2, 將每一個子問題的解記錄下來, 避免重復計算
3, 把暴力遞歸的過程, 抽象成了狀態表達
4, 并且存在化簡狀態表達, 使其更加簡潔的可能
動態規劃其實是由暴力遞歸演變而來的,每個動態規劃的接法基本都能找到其動態規劃的版本~
他們的關系如下:
暴力遞歸------》依賴關系(套路,即記憶關系)------》動態規劃
下面以一道題為例子來向大家詳細的介紹一下:
先理解一下題意:
給定一個數組和一個整數,可以隨便選擇arr數組里面的數字,看看累加起來能不能得到aim,可以得到就返回true,不可以返回false
eg :arr[] = { 3, 2, 9, 7 }; ?Aim = 21;返回true 3+2+9+7=21
????????arr[] = { 3, 2, 9, 7 };?Aim = 13;返回false,無法組合得到13
思路分析:
先用暴力遞歸的方式來解決:
先看一下方法的參數,參數有arr[]和Aim是題目提供的,我們自己定義的有i和sum,這兩個參數是什么意思呢?
他們的含義是,在一個數組中,從i下標開始,可以任意去i后面的數進行累加,累加的和為sum,看圖:
如果你能想到這個圖或者說看到這個圖,你就已經成功了一半~~
可以發現,要判斷這個數組中是否有滿足要求的組合,只要看最后一行是否有相應的aim值就可以了。
所以,就有了下面的暴力遞歸:
暴力遞歸之后,就是動態規劃了~
來來來,重點來了,從暴力遞歸轉變到動態規劃,跟題意是沒有半毛錢關系的~
下面劃重點了:
暴力遞歸------》依賴關系(套路,即記憶關系)------》動態規劃
這里還差了個依賴關系:
啥都別說了,先畫個圖吧嘻嘻~
還是以上面那個例子為主:
arr[3] = {2,3,7};
aim = 10;
那么i的取值范圍就是0~3了
sum的取值則是2+3+7=12即(0~12)
先看暴力破解法的basecase:
辣么,第三行sum等于Aim的值就為true,其他為false;
再看基本關系:
通過細細分析,可以得到下面的依賴關系圖了~
圖中的方框加×是(i,sum)的依賴,也就是說,要想得到(I,sum)的值,只要知道兩個方框加×里面的值就可以推出來了( 不是我說的,是程序里面體現出來的)那么,因為第三列的值都知道了,那么其他列的值肯定也可以通過這一列的值推出來,那么我們所要求的(0,0)的值不就出來了嗎?
這個依賴關系出來之后,那么動態規劃的解也就出來了~~~(開心)
其實這個方法我也是思考了很久才領悟的~
希望對你們也能有所幫助~~不懂歡迎留言,懂得幫忙點個贊~~~
總結
以上是生活随笔為你收集整理的史上最容易理解的暴力递归和动态规划~~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode算法入门- Search
- 下一篇: 看完这篇文章,还不懂nginx,算我输