} void getmin(int n,int m[200][200],int s[200][200]){//n表示陣列的長度,m為乙個陣列(記錄每一段的最大得分),s記錄每一段的額分界點
int i;
int j;
int r;
int k;
int t;
for(r=2;r<=n;r++)
for(i=1;i<=n-r+1;i++){
j=i+r-1;
m[i][j] =m[i][i]+m[i+1][j]+sum(i,j,m);
s[i][j]=i;
for(k=i+1;k問題分析:
這個問題可以通過分治法來解決,也可以通過動態規劃的方式來解決。再這裡介紹動態規劃的方式來解決問題。動態規劃的兩個重要因素是重疊自問題性質和最優子結構。
1.當問題的最優解包含了其子問題的最優解時,稱為問題具有最優子結構性質。
2.重疊子問題:再用遞迴法從頂向下解決問題時,每次產生的子問題並不是新問題,有些新問題被反覆計算多次。
對於最小得分, 解決問題時可以自下向上解決。首先得到任意一堆的最小得分,然後在此基礎上得到任意兩隊最小的分,依次類推。最終得到問題的解。對於最大得分的分析方法也一樣。
石子合併問題
在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。分析 假設有n堆石子需要合併,可以設計乙個2 n 1個元素的陣列來儲存每堆石子的個數。...
石子合併問題
在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。沒有用dp 感覺一般的也能寫,時間複雜度也不高。include include inc...
石子合併問題
石子合併問題是最經典的dp問題。首先它有如下3種題型 1 有n堆石子,現要將石子有序的合併成一堆,規定如下 每次只能移動任意的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這n堆石子合併成一堆的總花費最小 或最大 分析 當然這種情況是最簡單的情況,合併的是任意兩堆,直接貪心即可,每次選擇最小的...