石子合併問題

2021-07-05 23:04:28 字數 1152 閱讀 6263

問題描述:在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。

輸入檔案:

input.txt

4 4 5 9

輸出檔案:

output.txt

演算法思路:仿照動態規劃求解矩陣連乘問題的方式,與矩陣連乘問題不同的是,它的結構是乙個環。

#includeconst int n = 64;

int sum[n];

int arr[n];

int dp_min[n][n];

int dp_max[n][n];

//求最小值

int min(int lhs, int rhs)

//求最大值

int max(int lhs, int rhs)

void computer(int arr, int arr_length, int& min_num, int& max_num)

for (int r = 1; r < arr_length; r++)

else

dp_min[i][j] = dp_min[i][(i + 1) % arr_length] + dp_min[(i + 2) % arr_length][j] + tm;

dp_max[i][j] = dp_max[i][(i + 1) % arr_length] + dp_max[(i + 2) % arr_length][j] + tm;

for (int k = i, index = i ; index < i + r; index++)

} }min_num = dp_min[0][arr_length - 1];

max_num = dp_max[0][arr_length - 1];

for (int i = 0; i < arr_length; i++)

}int main(void)

} computer(arr, n, min_num, max_num);

std::cout << min_num << "\n" << max_num << std::endl;

return 0;

}

石子合併問題

在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。分析 假設有n堆石子需要合併,可以設計乙個2 n 1個元素的陣列來儲存每堆石子的個數。...

石子合併問題

在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。沒有用dp 感覺一般的也能寫,時間複雜度也不高。include include inc...

石子合併問題

石子合併問題是最經典的dp問題。首先它有如下3種題型 1 有n堆石子,現要將石子有序的合併成一堆,規定如下 每次只能移動任意的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這n堆石子合併成一堆的總花費最小 或最大 分析 當然這種情況是最簡單的情況,合併的是任意兩堆,直接貪心即可,每次選擇最小的...