Pixiv - KiraraShss
239 字
1 分钟
石子合并
题目描述

输入格式
第一行一个数 表示石子的堆数 。
第二行 个数,表示每堆石子的质量(均不超过1000)。
输出格式
输出一个整数,表示最小代价。
数据范围
1≤≤300
输入样例:
41 3 5 2输出样例:
22分析

- 合并的代价其实就是的价值的总和,所以可以使用前缀和
区间DP一般都是两层循环,外层len,内层起点
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 310;
int n;int s[N], f[N][N];
int main(){ cin >> n; for (int i = 1; i <= n; i ++ ) cin >> s[i], s[i] += s[i - 1];
for (int len = 2; len <= n; len ++ ) for (int i = 1; i + len - 1<= n; i ++ ) { int j = i + len - 1; f[i][j] = 1e8; for (int k = i; k < j; k ++ ) f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + s[j] - s[i - 1]); }
cout << f[1][n] << endl;
return 0;}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
最后更新于 2025-04-27,距今已过 362 天
部分内容可能已过时
printsdf's Blog