问题描述:在一个圆形操场的四周摆放着n堆石子,现要将石子有次序的合并成一堆。每次只能选择相邻的2堆石子合并成新的一堆,并将新的一对石子数记为该次合并的得分。
求 最小值和最大值
in:
4
4 4 5 9
out:
43
54
1.首先考虑 石子是环形摆放
所以可以 将数组存放成 4 4 5 9 4 4 5
2.然后从局部最优求到全局最优其中采用2个数组来储存 运算过程用到的数据
m**用来储存合并后石子的数量
result**用来储存得分
void maxdynamic(int *p, int n, int **m,int**result) {//n为数组个数
for (int i = 0; i < 2*n-1; i++) {
m[i][i] = p[i];//m存放没堆石头的个数
result[i][i] = 0;//存放分数
}
for (int r = 2; r <= n*2-r; r++)//这里 r<n*2-r 可以改成 r<n 减少运算次数
for (int i = 0; i <n; i++) {
int j = i + r - 1;//左值:i 右值:j 宽度:r
for (int k = i; k < j; k++) {//假设k为断开的地方,计算result 和m
int t = m[i][k] + m[k + 1][j]+result[i][k]+result[k+1][j];//左边+右边+之前分数