暴力遞迴與動態規劃

2021-09-28 22:11:00 字數 4016 閱讀 5024

1、漢諾塔問題。列印n層漢諾塔從最左邊移動到最右邊的全部過程。

public static void main(string args) 

public static void method(int n, string from, string to, string help)

method(n - 1, from, help, to);

system.out.println("move " + n + " from " + from + " to " + to);

method(n - 1, help, to, from);

}

move 1 from 左 to 右

move 2 from 左 to 中

move 1 from 右 to 中

move 3 from 左 to 右

move 1 from 中 to 左

move 2 from 中 to 右

move 1 from 左 to 右

2、列印乙個字串的全部子串行,包括空字串。

public static void method(string string) 

public static void method(string string, string res, int index)

//拼接當前index字元

method(string, res + string.charat(index), index + 1);

//不拼接當前index字元

method(string, res, index + 1);

}

3、列印乙個字串的全排列。

public static void method(string string) 

public static void method(char chars, int index)

//依次將index位置的數值設為後面的每乙個數

for (int i = index; i < chars.length; i++)

}public static void swap(char chars, int i, int j)

4、列印乙個字串的全部排列,要求不要出現重複的排列。1)、加乙個set去重。。

public static void method(string string) 

public static void method(char chars, int index, hashsetset)

return;

}for (int i = index; i < chars.length; i++)

swap(chars, index, i);

method(chars, index + 1, set);

swap(chars, index, i);}}

public static void swap(char chars, int i, int j)

2)、還沒想好。。

5、給你乙個二維陣列,二維陣列中的每個數都是正數,要求從左上角走到右下角,每一步只能向右或者向下。沿途經過的數字要累加起來。返回最小的路徑和。

思路:1)、從左上到右下,可以右移或下移,暴力遞迴列舉所有的路徑,取最小的。

public static void method(int arr) 

public static int method(int arr, int i, int j)

if (i == arr.length - 1)

if (j == arr[0].length - 1)

return math.min(arr[i][j] + method(arr, i, j + 1), arr[i][j] + method(arr, i + 1, j));

}

2)、動態規劃從右下角開始,每個數到右下角的最短路徑取決於當前數右邊的數下邊的數

public static int method2(int arr, int m, int n) 

if (i == tr)

if (j == td)

dp[i][j] = math.min(dp[i][j + 1], dp[i + 1][j]) + arr[i][j];}}

return dp[m][n];

}

6、給你乙個陣列arr,和乙個整數aim。如果可以任意選擇arr中的數字,能不能累加得到aim,返回true或者false1、遞迴列舉

public static boolean method(int arr, int aim) 

public static boolean method(int arr, int aim, int index, int res)

return false;

}return method(arr, aim, index + 1, res + arr[index]) || method(arr, aim, index + 1, res);}}

6、摺紙問題: 請把一段紙條豎著放在桌子上,然後從紙條的下邊向上方對折1次,壓出摺痕後展開。此時 摺痕是凹下去的,即摺痕突起的方向指向紙條的背面。如果從紙條的下邊向上方連續對折2 次,壓出摺痕後展開,此時有三條摺痕,從上到下依次是下摺痕、下摺痕和上摺痕。思路:摺痕將字條分成兩部分,下次對折時,摺痕的上部會出現乙個下摺痕,下部會出現乙個上摺痕。

public static void main(string args) 

public static void method(int num, boolean down)

method(num - 1, true);

system.out.println(down ? "down" : "up");

method(num - 1, false);

}

down 

down

up down

down

up up

7、給你乙個棧,請你逆序這個棧,不能申請額外的資料結構,只能使用遞迴函式。如何實現?思路:要逆序,就是每次都取出當前棧的最底部的數,遞迴返回時將其壓入棧中

//每次都取出當前棧的最底部的數,遞迴返回時將其壓入棧中。

public static void method(stackstack)

int num = getandremovelastnumber(stack);

method(stack);

stack.push(num);

}//要取出最底部的數也是通過遞迴實現。

public static int getandremovelastnumber(stackstack)

int num = stack.pop();

last = getandremovelastnumber(stack);

stack.push(num);

return last;

}

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

1.1 暴力遞迴 1,把問題轉化為規模縮小了的同類問題的子問題 2,有明確的不需要繼續進行遞迴的條件 base case 3,有當得到了子問題的結果之後的決策過程 4,不記錄每乙個子問題的解 1.2 動態規劃 1,從暴力遞迴中來 2,將每乙個子問題的解記錄下來,避免重複計算 3,把暴力遞迴的過程,抽...

動態規劃與遞迴

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

js動態規劃與遞迴

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