网站建设设计有哪些,设计培训网页版,富邦建设控股集团网站,编辑wordpress模板设有 N 堆石子排成一排#xff0c;其编号为 1,2,3,…,N。
每堆石子有一定的质量#xff0c;可以用一个整数来描述#xff0c;现在要将这 N 堆石子合并成为一堆。
每次只能合并相邻的两堆#xff0c;合并的代价为这两堆石子的质量之和#xff0c;合并后与这两堆石子相邻的…设有 N 堆石子排成一排其编号为 1,2,3,…,N。
每堆石子有一定的质量可以用一个整数来描述现在要将这 N 堆石子合并成为一堆。
每次只能合并相邻的两堆合并的代价为这两堆石子的质量之和合并后与这两堆石子相邻的石子将和新堆相邻合并时由于选择的顺序不同合并的总代价也不相同。
例如有 44 堆石子分别为 1 3 5 2 我们可以先合并 1、2堆代价为 44得到 4 5 2 又合并 1、2堆代价为 9得到 9 2 再合并得到 11总代价为 491124
如果第二步是先合并 2、3堆则代价为 7得到 4 7最后一次合并代价为 11总代价为 471122
问题是找出一种合理的方法使总的代价最小输出最小代价。
输入格式
第一行一个数 N 表示石子的堆数 N。
第二行 N 个数表示每堆石子的质量(均不超过 1000)。
输出格式
输出一个整数表示最小代价。
数据范围
1≤N≤300
输入样例
4
1 3 5 2输出样例
22
#includeiostream
#includecstdio
#includecstdlib
#includestring
#includecstring
#includecmath
#includectime
#includealgorithm
#includeutility
#includestack
#includequeue
#includevector
#includeset
#includemap
using namespace std;
typedef long long LL;
const int N 300 5;
const int INF 1e9;
int n;
int sum[N], dp[N][N];int main() {cin n;for (int i 1; i n; i) {scanf(%d, sum[i]);sum[i] sum[i - 1];}for (int len 2; len n; len) {for (int l 1; l len - 1 n; l) {int r len l - 1;dp[l][r] INF;for (int k l; k r; k) {dp[l][r] min(dp[l][r], dp[l][k] dp[k 1][r] sum[r] - sum[l - 1]);}}}cout dp[1][n] endl;return 0;
}代码2
#includeiostream
#includecstdio
#includecstdlib
#includestring
#includecstring
#includecmath
#includectime
#includealgorithm
#includeutility
#includestack
#includequeue
#includevector
#includeset
#includemap
using namespace std;
typedef long long LL;
const int N 300 5;
const int INF 1e9;
int n;
LL sum[N], dp[N][N];int main() {cin n;for (int i 1; i n; i) {scanf(%ld, sum[i]);sum[i] sum[i - 1];}for (int i n; i 1; i--) {for (int j i 1; j n; j) {dp[i][j] INF;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;
}