石子归并问题:设有n堆石子排成一排,其编号为1,2,3,…,n(n≤100)每堆石子有一定的数量,如下13,7,8,16,21,4,18。现在要将n堆石子归并成一堆。每次只能将相邻的两堆石子堆成一堆,这样经过n一1次归并之后最后成为一堆,如上面7堆沙子,可以有多种方法归并成一堆,用c++采用动态规划的算法写一段代码求出合并代价总和最小的方案
时间: 2024-01-13 19:02:16 浏览: 86
ACM.rar_SCORES_堆石子 编程
好的,下面是C++代码实现:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int N = 110;
int a[N], sum[N];
int dp[N][N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++ )
{
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
dp[i][i] = 0;
}
for (int len = 2; len <= n; len ++ )
{
for (int i = 1; i + len - 1 <= n; i ++ )
{
int j = i + len - 1;
dp[i][j] = 1e9;
for (int k = i; k < j; k ++ )
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
}
}
cout << dp[1][n] << endl;
return 0;
}
```
时间复杂度为O(n^3),可以通过此题。
阅读全文