區間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 兩頭一樣,我們把中...