動態規劃(三) 區間DP, 計數類DP

2022-09-19 10:00:11 字數 2695 閱讀 3013

設有 \(n\) 堆石子排成一排,其編號為 \(1,2,3,…,n\)。

每堆石子有一定的質量,可以用乙個整數來描述,現在要將這 \(n\) 堆石子合併成為一堆。

每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。

例如有 \(4\) 堆石子分別為1 3 5 2, 我們可以先合併 \(1、2\) 堆,代價為 \(4\),得到4 5 2, 又合併 \(1,2\) 堆,代價為 \(9\),得到9 2,再合併得到 \(11\),總代價為 \(4+9+11=24\);

如果第二步是先合併 \(2,3\) 堆,則代價為 \(7\),得到4 7,最後一次合併代價為 \(11\),總代價為 \(4+7+11=22\)。

問題是:找出一種合理的方法,使總的代價最小,輸出最小代價。

輸入格式

第一行乙個數 \(n\) 表示石子的堆數 \(n\)。

第二行 \(n\) 個數,表示每堆石子的質量(均不超過 \(1000\))。

輸出格式

輸出乙個整數,表示最小代價。

資料範圍

\(1≤n≤300\)

輸入樣例:

4

1 3 5 2

輸出樣例:

22
code:
#pragma once

#include using namespace std;

const int n = 1010;

int f[n][n], n, prefix_sum[n];//f表示狀態,n表示個數,prefix_sum表示字首和

// f[i][j] 表示所有將第i堆石子到第j堆石子合併成一堆石子的方式的集合, 屬性值是集合的最小值

void combine_rock_piles()

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

}

乙個正整數 \(n\) 可以表示成若干個正整數之和,

形如:\(n=n_1+n_2+…+n_k,其中n_1≥n_2≥…≥n_k,k≥1\)。

我們將這樣的一種表示稱為正整數 \(n\) 的一種劃分。 現在給定乙個正整數 \(n\),請你求出\(n\)共有多少種不同的劃分方法。

輸入格式

共一行,包含乙個整數 \(n\)。

輸出格式

共一行,包含乙個整數,表示總劃分數量。 由於答案可能很大,輸出結果請對 \(10^9+7\) 取模。

資料範圍

1≤n≤1000

輸入樣例:

5
輸出樣例:

7
解法一:

轉化為完全揹包問題求解, \(f[i][j]\) 表示從 \(1~i\) 中選總體積恰好為 \(j\) 的選法數量。

狀態計算:

\(f[i][j] = f[i - 1[j]+f[i - 1][j - 1]+f[i - 1][j - 2]+……+f[i - 1][j - i * s]\)

\(f[i][j - i] = \ \ \ \ \ \ \ \ \ \ \ \ \ \ f[i - 1][j - 1]+f[i - 1][j - 2]+……+f[i - 1][j - i * s](s為 i * s ≤ j 下的最大值)\)

因此,\(f[i][j] = f[i - 1][j] + f[i][j - i]\)

#pragma once

#include using namespace std;

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

int f[n];

// f[i][j]表示從1 ~ i物品中所有選取體積恰好為j得選法得集合

// 集合屬性值是所有得方案數加在一起

// f[i][j] = f[i - 1][j] + f[i][j - i]

void integer_division()

解法二:

\(f[i][j]\) 表示所有總和是 \(i\),並且恰好表示成 \(j\) 個數的和的方案數。

狀態計算:

劃分為最小值為 \(1\) 時,方案數為 \(f[i - 1][j - 1]\);最小值大於 \(1\) 時,方案數為 \(f[i - j][j]\).

則 \(f[i][j] = f[i -1][j - 1] + f[i - j][j]\),最終結果是 \(f[n][1]+f[n][2]+……+f[n][n]\).

#pragma once

#include using namespace std;

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

int f[n][n];

void integer_division2()

動態規劃 區間DP 計數類DP

acwing 282.石子合併 區間dp的特點是狀態表示的時候表示的是某乙個區間的情況 動態規劃模型分析 即 不管石子如何合併,最後一步的操作一定是將兩堆石子合併 把步驟回到倒數第一步。當在做最後一次操作時遍歷所有區間,將最後一步最小的情況記錄進f陣列裡 部分如下 全域性變數 const int n...

動態規劃 計數類DP

計數類dp狀態函式的值是集合中元素的個數 1.例題 整數劃分 乙個正整數n可以表示成若干個正整數之和,形如 n n1 n2 nk,其中n1 n2 nk,k 1。我們將這樣的一種表示稱為正整數n的一種劃分。現在給定乙個正整數n,請你求出n共有多少種不同的劃分方法。輸入格式 共一行,包含乙個整數n。輸出...

動態規劃練習 UVa10003 區間dp

紫書上的動態規劃例題,很明顯是乙個區間線性規劃的問題,想起之前做過的矩陣鏈乘,這題和它很像,列舉方向都是向j i遞增的 方向,這裡有個大神的區間dp模板的總結 可以強化理解。所以,設dp i j 為切割小木棍i j點的費用,則dp i j min,a j a i 表示第一刀切割為i j的費用,而 d...