日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

五大经典算法之动态规划

發布時間:2024/4/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五大经典算法之动态规划 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概念起源

??動態規劃,又名DP算法(取自其Dynamic Programming的縮寫),最初是運籌學的一個分支,是用來求解決策過程最優化的數學方法。

二、基本思想

??把 多階段過程 轉化為一系列單階段過程,利用各階段之間的關系,逐個求解。那什么叫多階段過程呢?

多階段過程:首先大家可以思考一下以下這個問題:

假如我們有面值為1元/3元/5元的硬幣若干枚,如何用最少的硬幣湊夠137元?

當然我們可以使用暴力枚舉解決這個問題,不夠那樣復雜度就太高了。我們可以這樣考慮,湊齊137元可以看成一個最終目標,我們可以把它細分為先以最少的硬幣數量湊齊136元(這樣再加1元就137元了)或是133元或是132元 + 1次。然后我們的問題轉變為了先以最少的硬幣數量湊齊136元或是133元或是132元。看似問題數量變更多了,但是實際問題難度卻變小了。
而且這種細分方式可以不斷細分,一直細分到接近于0元。而在這個思維過程中,我們就是將解決137元的問題分階段的完成,而這個過程就叫做 多階段過程 。

三、解題步驟(思路)

  • 利用動態規劃思想從上往下思考問題:將多階段問題轉變成更小的多階段問題(狀態轉移方程)
  • 分解至最小的單階段問題(可直接解決問題)。
  • 利用循環從下往上解決問題。
  • 四、算法框架

    相對于其他基本算法,動態規劃算法比較靈活,其主體框架取決于其具體問題,具體問題決定具體的狀態轉移方程;因此,其不像回溯法有一套“亙古不變”的算法框架;所以以下的算法只能說是解決類似上述硬幣問題的DP算法框架,只能算是給各位拋磚引玉。

    ?變量解釋:

    ??res:存儲各階段問題的答案

    ??n:最終問題的標記位

    ??i:循環的索引

    ??f:某階段問題的答案與前些階段問題答案之間的函數關系

    void dp(int n) {// 定義問題的解數組int res[n + 1];// 初始化最小的單階段問題的解res[1] = 1 ...// 從初始化后的解數組的第一個位置開始循環計算res[i]int i = inital;while (i <= n) {// f函數取決于狀態轉移方程res[i] = f(res[i - 1], res[i - 2], res[i - 3]...);i++;}return res[n]; }

    五、經典實現

    經典問題:Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i.

    If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.

    Note that you cannot sell a stock before you buy one.

    Example 1:

    Input: [7,1,5,3,6,4]

    Output: 5

    Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
    Not 7-1 = 6, as selling price needs to be larger than buying price.
    Example 2:
    Input: [7,6,4,3,1]
    Output: 0
    Explanation: In this case, no transaction is done, i.e. max profit = 0.

    int maxProfit(int* prices, int pricesSize) {if (pricesSize == 0) {return 0;}int res[pricesSize];int min[pricesSize];res[0] = 0;min[0] = prices[0];int i = 1;while (i < pricesSize) {if (res[i - 1] < prices[i] - min[i - 1]) {res[i] = prices[i] - min[i - 1];} else {res[i] = res[i - 1];}if (prices[i] < min[i - 1]) {min[i] = prices[i];} else {min[i] = min[i - 1];}i++;}return res[pricesSize - 1]; }

    轉載于:https://www.cnblogs.com/codernie/p/9085180.html

    總結

    以上是生活随笔為你收集整理的五大经典算法之动态规划的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。