Idea 02 暴力遞迴與動態規劃(1)

2021-09-25 00:21:12 字數 2922 閱讀 4529

1.1 暴力遞迴:

1, 把問題轉化為規模縮小了的同類問題的子問題

2, 有明確的不需要繼續進行遞迴的條件(base case)

3, 有當得到了子問題的結果之後的決策過程

4, 不記錄每乙個子問題的解

1.2 動態規劃:

1, 從暴力遞迴中來

2, 將每乙個子問題的解記錄下來,避免重複計算

3, 把暴力遞迴的過程,抽象成了狀態表達

4, 並且存在化簡狀態表達,使其更加簡潔的可能

2.1 p類問題和np問題

p類問題:時間複雜度為多項式; 知道怎麼算,讓計算機幫我算。

np問題:時間複雜度很複雜,指數級或位置; 不知道怎麼算,但是知道怎麼嘗試。

2.2 嘗試的重要性

學會了嘗試,在不斷的實踐中積累經驗才能真正掌握這些演算法思想的精髓。許多本科畢業生甚至研究生,都缺乏這種能力。

3.1 求n!的值

#include using

namespace

std;

class

factorial

}//方法二:直接法

int factor2(int

n)

return

res;

}};int

main()

3.2 漢諾塔問題問題描述:

三根柱子:"left","mid","right"

要求:1.要把放在「left」桿子上的n個從大到小疊加放置的圓盤移動到「right」桿子上;

2.移動過程中,乙個只能移動乙個圓盤,且大的圓盤不能放置在小的圓盤上。

遞迴分解:

n為1時,"left"桿子上只有一塊圓盤,可以直接將它移動至"right"桿子上;(base case:遞迴出口)

n大於1時,要想使得第1步成立,要先把"left"上面的n-1塊圓盤移動至輔助的"mid"桿子上;

最後,將"mid"桿子上的n-1塊圓盤移動至"right"桿子上。

//

class

hanoi

void func(int n, string

from, string mid,string

to) }

private

: vector

res;

};

3.3 列印乙個字串(「abc」)的所有的子串行(注:不是子串)

a:選或不選   b:選或不選 c:選或不選  2×2×2=8種可能,包含空子序列。

3.4 列印乙個含n個字母的字串(如:「abc」)的所有的全排列

#case1:假設不含重複字母

遞迴思路:

(bese case:) n=1時,如果字串中只有乙個元素,直接生成全排列;

當n>1時,如果能生成n-1個元素的全排列,就能生成n個元素的全排列,以三個字元"abc"為例:

既然我們已經知道怎麼求三個字元的排列,那麼固定第乙個字元之後求後面兩個字元的排列,就是典型的遞迴思路了

/*

列印乙個字串中所有字母的全排列(假設不含重複字母))

*/#include

#include

using

namespace

std;

void printallarr(char str,int

i) cout

<

return

; }

else

}}void

main()

#case2:含有重複字母,且要求輸出結果無重複關鍵思路:如果str[i]和str[j]相同,則忽略交換。(如:"abca",遇到第乙個a和第四個a則不交換。)

#include #include 

using

namespace

std;

//判斷是否需要交換

int is_swap(char *str, int begin, int

k) }

return

flag;}//

列印所有的全排列

void printallarr(char str, int i, int

n) cout

<

return

; }

else}}

}void

main() ;

int length = sizeof(str) / sizeof(str[0]);//

獲取陣列長度

//cout <

, length);

}

暴力遞迴與動態規劃

1 漢諾塔問題。列印n層漢諾塔從最左邊移動到最右邊的全部過程。public static void main string args public static void method int n,string from,string to,string help method n 1,from,h...

動態規劃與遞迴

這裡借用leetcode的一道例題,來說一下動態規劃和遞迴的區別 給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 1 的兩個結點。例如,給定三角形 2 3,4 6,5,7 4,1,8,3...

js動態規劃與遞迴

動態規劃 從底部開始解決問題,將所有 小問題解決掉,然後合併成乙個整體解決方案,從而解決掉整個大問題 遞迴 從頂部開始將問題分解,通過解決掉所有分解的小問題來解決整個問題 計算斐波那契數列 function recurfib n else 遞迴 很多函式執行了多次 動態規劃使用乙個陣列儲存部分函式計...