演算法學習 動態規劃練習(一)

2022-02-06 15:07:41 字數 3814 閱讀 5204

1.1 題目介紹

121. 買賣**的最佳時機

給定乙個陣列,它的第 i 個元素是一支給定**第 i 天的**。

如果你最多隻允許完成一筆交易(即**和賣出一支**),設計乙個演算法來計算你所能獲取的最大利潤。

注意你不能在****前賣出**。

示例 1:

輸入: [7,1,5,3,6,4]

輸出: 5

解釋: 在第 2 天(**** = 1)的時候**,在第 5 天(**** = 6)的時候賣出,最大利潤 = 6-1 = 5 。

注意利潤不能是 7-1 = 6, 因為賣出**需要大於****。

示例 2:

輸入: [7,6,4,3,1]

輸出: 0

解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。

1.2 解題思路

想要利潤最大,盡可能地要保證購買的時候**最低,總利潤最高。由此可以列出狀態轉移方程。

buy = min

profilt = max

1.3 解法

public int maxprofit(int prices) 

return profilt;

}

2.1 題目介紹
陣列的每個索引做為乙個階梯,第 i個階梯對應著乙個非負數的體力花費值 costi。

每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。

您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。

示例 1:

輸入: cost = [10, 15, 20]

輸出: 15

解釋: 最低花費是從cost[1]開始,然後走兩步即可到階梯頂,一共花費15。

示例 2:

輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]

輸出: 6

解釋: 最低花費方式是從cost[0]開始,逐個經過那些1,跳過cost[3],一共花費6。

注意:cost 的長度將會在 [2, 1000]。

每乙個 cost[i] 將會是乙個integer型別,範圍為 [0, 999]。

2.2 解題思路

以樣本為例cost = [10, 15, 20]

n = 3;

最後一步:

根據題意我們知道,最後一步不一定是cost[2](即20),還有可能是之後的值,我們這裡假設有cost[3]且cost[3] = 0,這裡我們就統一認為最後一步是cost[3],因為它的需要用的體力值設定為0。所以最後走到cost[2]所用的總體力值,和走到cost[3]的是一樣的。

子問題

最後一步消耗的體力值是cost[3],總共消耗的體力值為f[3]。

走到了最後一步之後,往前回退,所面對的選擇是,要麼是倒退一步,要麼是倒退兩步。

於是有了子問題方程:

f[3] = min(f[1],f[2])+cost[3]

狀態轉移方程

f[x] = min(f[x-1],f[x-2])+cost[x]

初始條件

第一步可以從cost[0]開始走,也可以從cost[1]開始走。於是有了

f[0] = cost[0]

f[1] = cost[1]

邊界

int costlength = cost.length;

cost[costlengh+1] = 0

f[costlengh+1]為最終的解。

2.3 解法

public int mincostclimbingstairs(int cost)  else 

f[i] = math.min(f[i - 1], f[i - 2]) + tempcost;

}return f[n];

}

3.1 題目介紹

70. 爬樓梯

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是乙個正整數。

示例 1:

輸入: 2

輸出: 2

解釋: 有兩種方法可以爬到樓頂。

1 階 + 1 階

2 階

示例 2:

輸入: 3

輸出: 3

解釋: 有三種方法可以爬到樓頂。

1 階 + 1 階 + 1 階

1 階 + 2 階

2 階 + 1 階

3.2 解題思路

最後一步:

最後一步是第n個台階,我們這邊假設為4。

子問題

最後一步到第4個台階,假設總共有走法f[4]。

如果是走到第3個台階的話,就只能再走1步

如果走到第2個台階的話,可以走2步,或者走2次,分別走1步。

於是有了子問題方程:

f[4] = f[4-step1] + f[4-step2]

f[4] = f[3] + f[2]

狀態轉移方程

f[x] = f[x-1] + f[x-2]

3.3 解法

class solution 

//初始化

f[0] = 0;

f[1] = 1;

f[2] = 2;

//f[x] = f[x-1] + f[x-2]

for(int i=3;i<=n;i++)

return f[n];}}

4.1 題目介紹
給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4],

輸出: 6

解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

高階:

如果你已經實現複雜度為 o(n) 的解法,嘗試使用更為精妙的分治法求解。

4.2 解題思路

分析能不能使用dp,要考慮符不符合dp的子問題重疊,即乙個子問題,依賴於上乙個子問題

簡化輸入,只有-2,則dp[0] 為最大子串行和,dp[0] = -2,

假設只有,-2,1,則dp[1]會參考dp[0],會比較1與-2+1的大小,從而確定要不要前面的-2,由此可得出

$dp[i] = \max\ $

4.3 解法

public static int maxsubarray(int nums) 

return res;

}

leetcode中動態規劃題解合集

演算法學習 動態規劃練習(二)

1.1 題目介紹 62.不同路徑 1.2 解題思路 計數型動態規劃 最後一步 最右下角的座標假設為 m,n 則假設走到 m,n 所有可能的路徑為f m n 子問題 走到 m,n 的前一步有兩種可能一種是 m 1,n 一種是 m,n 1 狀態轉移方程 f m n f m 1 n f m n 1 初始化...

演算法學習 動態規劃

動態規劃是解決多階段決策過程最優化的一種方法。對於離散問題,解析數學無法施展,動態規劃則成為非常有效的工具。兩個弱點 1.得出目標函式方程後,尚無統一的處理方法,必須根據具體問題的性質結合相應的數學技巧來求解 2.維數障礙。動態規劃模型的分類 根據決策過程的時間參量是離散的還是連續的變數 1.離散 ...

演算法學習 動態規劃實踐

完成日期 2017.10.26 1.實踐題目 數字三角形 2.問題描述 給定乙個由 n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形 的頂至底的一條路徑 每一步可沿左斜線向下或右斜線向下 使該路徑經過的數字總和最大。3.演算法描述 1 首先該問題有最優子結構和重疊子問題的性質,因...