#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define mst(a, b) memset((a), (b), sizeof(a))
typedef long long ll;
const int maxn = 205;
const ll mod = 1e9 + 7;
const ll INF = 1e18;
const double eps = 1e-9;
int n, x;
int sum[maxn];
int dp[maxn][maxn];
int main() {
while (~scanf("%d", &n)) {
sum[0] = 0;
mst(dp, 0x3f); //初始化
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
sum[i] = sum[i - 1] + x; //前缀和
dp[i][i] = 0; //初始化,只有一堆的时候不需要代价
}
for (int len = 2; len <= n; len++) //阶段:区间长度
for (int i = 1; i <= n; i++) //状态:左端点
{
int j = i + len - 1; //状态:右端点
if (j > n)
continue; //决策
//sum[j]-sum[i-1]是这一次合并花费的代价,for循环知识在i到j里面找一个最合适的组合方式
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]);
}
}
printf("%d\n", dp[1][n]);
}
return 0;
}```
石子合并(一)(直线相邻)(区间dp)
最新推荐文章于 2024-10-05 12:07:50 发布