动态规划--合并石子
2018-10-29 16:17 muamaker 阅读(928) 评论(0) 收藏 举报
动态规划:
minx[i][j] 记录着 从第 i 堆到第 j 堆的合并最小花费,令 minx[i][j] = 0;
sum[i] 为前 i 堆石子数量的总和 sum[0] = 0;
1、假如 i 和 j 中间存在 k 使得 minx[i][j] > minx[i][k] + minx[k+1][j] + sum[j] - sum[i-1]; i <= k < j;
则 minx[i][j] = minx[i][k] + minx[k+1][j] + sum[j] - sum[i-1];
i = 1, j =2; k = 1;
minx[1][2] = minx[1][1] + minx[2][2] + sum[2] - sum[0] = 13;
i = 1, j = 3 ; k = 1、2;
...
//动态规划--石子
function straight(arr){
arr.unshift(0);
var n = arr.length+1;
var sum = []; // i 为前 i项的石子数和 sum[0] = 0; sum = [0,5,13,19,28,30,33];
var minx = [];
//初始化
sum[0] = 0;
for(var i = 1 ; i <= n; i++){
minx[i] = [];
minx[i][i] = 0;
sum[i] = sum[i-1] + arr[i];
}
//枚举
for(var v = 2; v <= n; v++ ){
for(var i = 1; i <= n-v-1; i++){ //起点
var j = i + v - 1; //终点
console.log(i,j)
minx[i][j] = Infinity; //初始化
var temp = sum[j] - sum[i-1];
for(var k = i; k < j; k++ ){
minx[i][j] = Math.min(minx[i][j],minx[i][k] + minx[k+1][j] + temp);
}
}
}
console.log(minx);
return minx[1][n-2];
}
console.log(straight([5,8,6,9,2,3]));
浙公网安备 33010602011771号