欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言?深入理解動態(tài)規(guī)劃之計數(shù)類DP

 更新時間:2022年04月12日 15:06:56   作者:小羊努力變強  
動態(tài)規(guī)劃可謂是大名鼎鼎,筆試面試中的高頻考點,也是重點難點,動態(tài)規(guī)劃類型題目靈活多變,難度系數(shù)也相對較高,往往我們做不好動態(tài)規(guī)劃的題目就會與心儀的offer失之交臂,本篇文章我們就一起來研究一下動態(tài)規(guī)劃的計數(shù)類DP

寫在前面

之前講過背包問題,線性DP,區(qū)間DP,不知道大家忘了嗎,這次是計數(shù)類DP

石子合并

在這里插入圖片描述

在這里插入圖片描述

老規(guī)矩,先畫圖。

思路:把1,2,3, … n分別看做n個物體的體積,這n個物體均無使用次數(shù)限制,問恰好能裝滿總體積為n的背包的總方案數(shù)(完全背包問題變形)

初值問題:

求最大值時,當都不選時,價值顯然是 0

而求方案數(shù)時,當都不選時,方案數(shù)是 1(即前 i 個物品都不選的情況也是一種方案),所以需要初始化為 1

即:for (int i = 0; i <= n; i ++) f[i][0] = 1;

等價變形后: f[0] = 1

狀態(tài)計算:

f[i][j]表示前i個整數(shù)(1,2…,i)恰好拼成j的方案數(shù)

求方案數(shù):把集合選0個i,1個i,2個i,…全部加起來

f[i][j] = f[i - 1][j] + f[i - 1][j - i] + f[i - 1][j - 2 * i] + …;

f[i][j - i] = f[i - 1][j - i] + f[i - 1][j - 2 * i] + …;

因此 f[i][j]=f[i−1][j]+f[i][j−i]; (這一步類似完全背包的推導)

樸素做法

// f[i][j] = f[i - 1][j] + f[i][j - i]
#include <bits/stdc++.h>

using namespace std;

const int N = 1e3 + 7, mod = 1e9 + 7;

int f[N][N];

int main() {
    int n;
    cin >> n;

    for (int i = 0; i <= n; i ++) {
        f[i][0] = 1; // 容量為0時,前 i 個物品全不選也是一種方案
    }

    for (int i = 1; i <= n; i ++) {
        for (int j = 0; j <= n; j ++) {
            f[i][j] = f[i - 1][j] % mod; // 特殊 f[0][0] = 1
            if (j >= i) f[i][j] = (f[i - 1][j] + f[i][j - i]) % mod;
        }
    }

    cout << f[n][n] << endl;
}

等價變形

// f[i][j] = f[i - 1][j] + f[i][j - i]
#include <bits/stdc++.h>

using namespace std;

const int N = 1e3 + 7, mod = 1e9 + 7;

int f[N];

int main() {
    int n;
    cin >> n;


    f[0] = 1; // 容量為0時,前 i 個物品全不選也是一種方案

    for (int i = 1; i <= n; i ++) {
        for (int j = i; j <= n; j ++) {
            f[j] = (f[j] + f[j - i]) % mod;
        }
    }

    cout << f[n] << endl;
}

上面是完全背包問題的解法,再來看看不用完全背包問題求解

在這里插入圖片描述

狀態(tài)計算:分兩部分

  • 這j個數(shù)中存在最小值為1的數(shù) 先去掉這一個1,其他部分表示為總和為i-1,恰好由j-1個數(shù)f[i-1][j-1]
  • 這j個數(shù)中存在的最小值都>1 j個數(shù)都>1,讓j個數(shù)都-1,求總和為j-i,由j個數(shù)的方案表示:f[i-j][j]

綜上所述:f[i][j] = f[i - 1][j - 1] + f[i - j][j];

//非背包做法
//狀態(tài)表示:f[i][j] 所有總和是i,并且恰好可以表示成j個數(shù)的和的方案
#include <bits/stdc++.h>

using namespace std;

const int N = 1010, mod = 1e9 + 7;

int n;
int f[N][N];

int main()
{
    cin >> n;

    f[0][0] = 1;
    for (int i = 1; i <= n; i ++ )
        //i最多表示成i個數(shù)的和,因此j<=i
        for (int j = 1; j <= i; j ++ )
            f[i][j] = (f[i - 1][j - 1] + f[i - j][j]) % mod;

    int res = 0;
    for (int i = 1; i <= n; i ++ ) res = (res + f[n][i]) % mod;

    cout << res << endl;

    return 0;
}

到此這篇關于C語言 深入理解動態(tài)規(guī)劃之計數(shù)類DP的文章就介紹到這了,更多相關C語言 計數(shù)類DP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++驅(qū)動bash的實現(xiàn)代碼

    C++驅(qū)動bash的實現(xiàn)代碼

    這篇文章主要介紹了C++驅(qū)動bash的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • C語言遞歸系列的深入總結(jié)

    C語言遞歸系列的深入總結(jié)

    這篇文章主要給大家總結(jié)介紹了關于C語言遞歸系列的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • C語言實現(xiàn)窗口抖動

    C語言實現(xiàn)窗口抖動

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)窗口抖動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C++中各種初始化方式示例詳解

    C++中各種初始化方式示例詳解

    這篇文章主要給大家介紹了關于C++中各種初始化方式的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • C++基本用法實踐之移動語義詳解

    C++基本用法實踐之移動語義詳解

    移動(move)語義是C++引入了一種新的內(nèi)存優(yōu)化,以避免不必要的拷貝,下面小編就來和大家簡單聊聊C++中移動語義的相關使用吧,希望對大家有所幫助
    2023-07-07
  • Visual Studio 2019下配置 CUDA 10.1 + TensorFlow-GPU 1.14.0

    Visual Studio 2019下配置 CUDA 10.1 + TensorFlow-GPU 1.14.0

    這篇文章主要介紹了Visual Studio 2019下配置 CUDA 10.1 + TensorFlow-GPU 1.14.0,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Qt4和Qt5的信號和槽的使用區(qū)別

    Qt4和Qt5的信號和槽的使用區(qū)別

    本文主要介紹了Qt4 和 Qt5 的信號和槽的連接 connect 與斷開 disconnect 區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++利用棧實現(xiàn)中綴表達式轉(zhuǎn)后綴表達式

    C++利用棧實現(xiàn)中綴表達式轉(zhuǎn)后綴表達式

    這篇文章主要為大家詳細介紹了C++利用棧實現(xiàn)中綴表達式轉(zhuǎn)后綴表達式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Matlab制作視頻并轉(zhuǎn)換成gif動態(tài)圖的兩種方法

    Matlab制作視頻并轉(zhuǎn)換成gif動態(tài)圖的兩種方法

    這篇文章主要介紹了Matlab制作視頻并轉(zhuǎn)換成gif動態(tài)圖的兩種方法,第一種方法使用movie(f)直接取生成AVI視頻文件,相對來說比較簡單,需要的朋友可以參考下
    2018-08-08
  • C++實現(xiàn)LeetCode(兩個有序數(shù)組的中位數(shù))

    C++實現(xiàn)LeetCode(兩個有序數(shù)組的中位數(shù))

    這篇文章主要介紹了C++實現(xiàn)LeetCode(兩個有序數(shù)組的中位數(shù)),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論