最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?動態(tài)規(guī)劃算法使用分析

 更新時間:2022年03月24日 17:16:20   作者:ymz123_  
動態(tài)規(guī)劃算法通常用于求解具有某種最優(yōu)性質(zhì)的問題。在這類問題中,可能會有許多可行解。每一個解都對應(yīng)于一個值,我們希望找到具有最優(yōu)值的解

Fibonacci

題目描述:

大家都知道斐波那契數(shù)列,現(xiàn)在要求輸入一個正整數(shù) n ,請你輸出斐波那契數(shù)列的第 n 項。

解題思路:

1.遞歸

2.動態(tài)規(guī)劃

狀態(tài):F(n)

狀態(tài)遞推:F(n)=F(n-1)+F(n-2)

初始值:F(1)=F(2)=1

返回結(jié)果:F(N)

代碼實現(xiàn):

法一:遞歸(效率低):

class Solution{public: int Fibonacci(int n)
{        // 初始值 
	if (n <= 0)
	{ 
		return 0; 
	} 
	if (n == 1 || n == 2) 
	{
		return 1; 
	}        
	// F(n)=F(n-1)+F(n-2) 
	return Fibonacci(n - 2) + Fibonacci(n - 1); }};

法二:動態(tài)規(guī)劃

class Solution {
public:
    int Fibonacci(int n) {
        if(n==1 || n==2)
            return 1;
        int fn;
        int fn1 = 1, fn2 = 1;
        for(int i = 2; i < n; i++)
        {
            fn = fn1 + fn2;
            fn1 = fn2;
            fn2 = fn;
        }
        
        return fn;
        /*上述解法的空間復(fù)雜度為O(n)
        其實F(n)只與它相鄰的前兩項有關(guān),
        所以沒有必要保存所有子問題的解
        只需要保存兩個子問題的解就可以
        下面方法的空間復(fù)雜度將為O(1)*/
        if(n==1 || n==2)
            return 1;
        int* F = new int[n];
        //初始狀態(tài)
        F[0] = 1;
        F[1] = 1;
        for(int i = 2; i < n; i++)
        {
            F[i] = F[i-1] + F[i-2];
        }
        
        return F[n-1];
    }
};

字符串分割(Word Break)

題目描述:

給定一個字符串s和一組單詞dict,判斷s是否可以用空格分割成一個單詞序列,使得單詞序列中所有的單詞都是dict中的單詞(序列可以包含一個或多個單詞)。

例如:

給定s=“nowcode”;

dict=[“now”, “code”].

返回true,因為"nowcode"可以被分割成"now code".

解題思路:

狀態(tài):

  • 子狀態(tài):前1,2,3,…,n個字符能否根據(jù)詞典中的詞被成功分詞
  • F(i): 前i個字符能否根據(jù)詞典中的詞被成功分詞

狀態(tài)遞推:

  • F(i): true{j <i && F(j) && substr[j+1,i]能在詞典中找到} OR false 在j小于i中,只要能找到一個F(j)為true,并且從j+1到i之間的字符能在詞典 中找到,則F(i)為true

初始值:

  • 對于初始值無法確定的,可以引入一個不代表實際意義的空狀態(tài),作為狀態(tài)的起始 空狀態(tài)的值需要保證狀態(tài)遞推可以正確且順利的進行,到底取什么值可以通過簡單的例子進行驗證 F(0) = true

返回結(jié)果:F(n)

代碼實現(xiàn):

class Solution {
public:
    bool wordBreak(string s, unordered_set<string> &dict) {
        int len = s.size();
        vector<bool> F(len+1, false);
        F[0] = true;
        for(int i = 1; i <= len; i++)
        {
            //F[8]的狀態(tài):7<8 && F[7] && [8,8]
            //F[8]的狀態(tài):6<8 && F[6] && [7,8] 
            for(int j = i-1; j >= 0; j--)
            {
                if(F[j] && dict.find(s.substr(j,i-j)) != dict.end())
                {
                    F[i] = true;
                    break;
                }
            }
        }
        
        return F[len];
    }
};

三角矩陣(Triangle)

題目描述:

給出一個三角形,計算從三角形頂部到底部的最小路徑和,每一步都可以移動到下面一行相鄰的數(shù)字

例如,給出的三角形如下:

[[20],[30,40],[60,50,70],[40,10,80,30]]

解題思路:

狀態(tài):子狀態(tài):從(0,0)到(1,0),(1,1),(2,0),…(n,n)的最短路徑和 F(i,j): 從(0,0)到(i,j)的最短路徑和

狀態(tài)遞推: F(i,j) = min( F(i-1, j-1), F(i-1, j)) + triangle[i][j]

初始值: F(0,0) = triangle[0][0]返回結(jié)果: min(F(n-1, i))

代碼實現(xiàn):

class Solution {
public:
    int minimumTotal(vector<vector<int> > &triangle) {
        if(triangle.empty())
            return 0;
        int row = triangle.size();
        vector<vector<int> > minSum(triangle);
        for(int i = 1; i < row; i++)
        {
            for(int j = 0; j <= i; j++)
            {
                if(j == 0)
                    minSum[i][j] = minSum[i-1][j] + triangle[i][j];
                else if(j == i)
                    minSum[i][j] = minSum[i-1][j-1] + triangle[i][j];
                else
                    minSum[i][j] = min(minSum[i-1][j], minSum[i-1][j-1])
                                   + triangle[i][j];
            }
        }
        int result = minSum[row-1][0];
        for(int i = 1; i < triangle.size(); i++)
        {
            result = min(result, minSum[row-1][i]);
        }
        
        return result;
    }
};

路徑總數(shù)(Unique Paths)

題目描述:

一個機器人在m×n大小的地圖的左上角(起點)。 機器人每次可以向下或向右移動。機器人要到達地圖的右下角(終點)。 可以有多少種不同的路徑從起點走到終點?

解題思路:

狀態(tài):子狀態(tài):從(0,0)到達(1,0),(1,1),(2,1),…(m-1,n-1)的路徑數(shù) F(i,j): 從(0,0)到達F(i,j)的路徑數(shù)

狀態(tài)遞推: F(i,j) = F(i-1,j) + F(i,j-1)

初始化: 特殊情況:第0行和第0列 F(0,i) = 1 F(i,0) = 1

返回結(jié)果: F(m-1,n-1)

代碼實現(xiàn):

class Solution {
public:
    /**
     * 
     * @param m int整型 
     * @param n int整型 
     * @return int整型
     */
    int uniquePaths(int m, int n) {
        // write code here
        vector<vector<int> > ret(m, vector<int>(n,1));
        for(int i = 1; i < m; i++)
        {
            for(int j = 1; j < n; j++)
            {
                ret[i][j] = ret[i-1][j] + ret[i][j-1];
            }
        }
        
        return ret[m-1][n-1];
    }
};

最小路徑和(Minimum Path Sum)

題目描述:

給定一個由非負整數(shù)填充的m x n的二維數(shù)組,現(xiàn)在要從二維數(shù)組的左上角走到右下角,請找出路徑上的所有數(shù)字之和最小的路徑。 注意:你每次只能向下或向右移動。

解題思路:

狀態(tài):子狀態(tài):從(0,0)到達(1,0),(1,1),(2,1),…(m-1,n-1)的最短路徑 F(i,j): 從(0,0)到達F(i,j)的最短路徑。

狀態(tài)遞推: F(i,j) = min{F(i-1,j) , F(i,j-1)} + (i,j)

初始化: F(0,0) = (0,0) 特殊情況:第0行和第0列 F(0,i) = F(0,i-1) + (0,i) F(i,0) = F(i-1,0) + (i,0)

返回結(jié)果: F(m-1,n-1)

代碼實現(xiàn):

class Solution {
public:
    /**
     * 
     * @param grid int整型vector<vector<>> 
     * @return int整型
     */
    int minPathSum(vector<vector<int> >& grid) {
        // write code here
        if(grid.size() == 0 || grid[0].size() == 0)
            return 0;
        int M = grid.size();
        int N = grid[0].size();
        vector<vector<int> > ret(M, vector<int>(N,0));
        ret[0][0] = grid[0][0];
        for(int i = 1; i < N; i++)
        {
            ret[0][i] = ret[0][i-1] + grid[0][i];
        }
        for(int i = 1; i < M; i++)
        {
            ret[i][0] = ret[i-1][0] + grid[i][0];
        }
        for(int i = 1; i < M; i++)
        {
            for(int j = 1; j < N; j++)
            {
                ret[i][j] = min(ret[i-1][j],ret[i][j-1]) + grid[i][j];
            }
        }
        
        return ret[M-1][N-1];
    }
};

到此這篇關(guān)于C++ 動態(tài)規(guī)劃算法使用分析的文章就介紹到這了,更多相關(guān)C++ 動態(tài)規(guī)劃內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C語言在STM32中的內(nèi)存分配問題

    詳解C語言在STM32中的內(nèi)存分配問題

    這篇文章主要介紹了C語言在STM32中的內(nèi)存分配,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Qt?QPainter的使用方法

    Qt?QPainter的使用方法

    QPainter是Qt的一個繪圖類,它的主要任務(wù)是在繪圖設(shè)備上進行2D圖形渲染,本文主要介紹了Qt?QPainter的使用方法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C語言 常量詳解及示例代碼

    C語言 常量詳解及示例代碼

    本文主要講解C語言 常量,這里整理了 C語言常量的基礎(chǔ)知識,并附代碼示例和示例詳細講解,希望能幫助開始學(xué)習(xí)C 語言的同學(xué)
    2016-08-08
  • C語言基礎(chǔ)之C語言格式化輸出函數(shù)printf詳解

    C語言基礎(chǔ)之C語言格式化輸出函數(shù)printf詳解

    這篇文章主要介紹了C語言格式化輸出函數(shù)printf詳解,printf函數(shù)中用到的格式字符與printf函數(shù)中用到的格式修飾符,感興趣的小伙伴可以借鑒一下
    2023-03-03
  • Qt增加版本公司等信息兩種方式

    Qt增加版本公司等信息兩種方式

    在項目中生成exe或者動態(tài)庫過程中可能需要加入公司信息、版本號、說明等等,下面這篇文章主要給大家介紹了關(guān)于Qt增加版本公司等信息的兩種方式,需要的朋友可以參考下
    2024-01-01
  • OpenCV實現(xiàn)圖像距離變換

    OpenCV實現(xiàn)圖像距離變換

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像距離變換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 淺談關(guān)于C++memory_order的理解

    淺談關(guān)于C++memory_order的理解

    這篇文章主要介紹了淺談關(guān)于C++memory_order的理解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 關(guān)于win32 gettimeofday替代方案

    關(guān)于win32 gettimeofday替代方案

    下面小編就為大家?guī)硪黄P(guān)于win32 gettimeofday替代方案。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++中正則表達式的使用方法詳解

    C++中正則表達式的使用方法詳解

    幾乎所有的編程語言都支持正則表達式。 C++從C++11開始直接支持正則表達式。除了編程語言之外,大多數(shù)文本處理程序都使用正則表達式。本文將探討正則表達式的一般細節(jié)以及C++編程方面的細節(jié),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法

    C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法

    這篇文章主要介紹了C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法,十分的實用,有需要的小伙伴可以參考下。
    2015-06-06

最新評論

太和县| 宽甸| 民勤县| 红安县| 江山市| 三都| 南皮县| 舟曲县| 精河县| 泰安市| 宁武县| 金沙县| 南城县| 公主岭市| 农安县| 石棉县| 波密县| 祁连县| 湘阴县| 江孜县| 泊头市| 福建省| 仁化县| 佛坪县| 重庆市| 剑川县| 常宁市| 南汇区| 藁城市| 遵义县| 嘉善县| 屏边| 师宗县| 汝城县| 金门县| 教育| 桃江县| 太仆寺旗| 扎鲁特旗| 甘孜县| 长治市|