區間DP入門

2021-08-18 07:11:21 字數 1073 閱讀 2175

區間dp,看名字其實會聯想到劃分dp,其實兩者的關係並不大。劃分dp是從頭到尾劃分解決,並且有劃分數量,而區間dp沒有這些限制條件,可以從任意區間開始,一直擴大到整個區間。不斷遞推求解。同樣也是分兩步去做。

首先:還是進行資料處理,比如用陣列sum【i】【j】去儲存i到j的和,或者是用別的方式處理並儲存。

其次:建立dp方程推出結果。核心內容如下:

for(int t = j; t < k; t++)

dp[j][k] = min;

dp[i][j]表示在區間i到j得到結果,每個區間其實相當於兩個小區間的合併。根據這個我們可以得到遞推方程dp[i][k]=min(dp[i][t] + dp[t+1][k], dp[i][k]);

題目描述 description

有n堆石子排成一列,每堆石子有乙個重量w[i], 每次合併可以合併相鄰的兩堆石子,一次合併的代價為兩堆石子的重量和w[i]+w[i+1]。問安排怎樣的合併順序,能夠使得總合併代價達到最小。

輸入描述 input description

第一行乙個整數n(n<=100)

第二行n個整數w1,w2...wn (wi <= 100)

輸出描述 output description

乙個整數表示最小合併代價

樣例輸入 sample input

44 1 1 4

樣例輸出 sample output

18

#include #include #include using namespace std;

int dp[105][105];

int m[105][105];

int main()

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

}memset(dp, 0, sizeof(dp));

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

dp[j][k] = min;}}

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

return 0;

}

區間DP入門

今天學長給我們講了區間dp,當然聽得雲裡霧裡,講完之後基本處於自閉狀態,然後還是自己到大佬的部落格,然後看部落格,但是並沒有找到很詳細的部落格,所以我想自己寫一寫,大神們勿噴哈.一 定義 區間dp,顧名思義是在區間上dp,它的主要思想就是先在小區間進行dp得到最優解,然後再利用小區間的最優解合併求大...

區間dp入門

區間dp就是區間上的dp,先算出小區間的最優解,再由小區間合併推出大區間的最優解。include include include includeusing namespace std const int inf 0x3f3f3f3f const int maxn 1010 int n int a m...

區間DP入門

給你乙個只含小寫字母的字串,每次只能刪除一段含有一樣字母的區間,問最少刪多少次,才能刪除整個字串 第一次做區間dp 所以記錄詳細點 適合新手 我們用dp i j 代表把區間 i 到 j 完全刪除需要的次數 狀態轉移方程 if s i s j dp i j dp i 1 j 1 1 兩頭一樣,我們把中...