【发布时间】:2021-05-04 06:05:42
【问题描述】:
您好,我在 dp 有一个问题,如下所示:
输入:二维数字数组
输出:从 (0,0) 到 (n-1,n-1) 的路径的最大总和,其中需要满足这两个条件:
-
只能向下向右移动意思:
(A[i-1][j]) --> (A[i][j]) 或 (A[i][j-1]) --> (A[i][j])
-
你不能在一行中水平移动 3 次
到目前为止我的代码:
export default (arr: Array<Array<number>>) => {
let B: Array<Array<{ info: number, rightCount: number }>> = init2DArr(arr.length, arr[0].length) // when
B[0][0] = { info: arr[0][0], rightCount: 0 };
for (let i = 1; i < arr.length; i++) {
B[0][i] = { info: (arr[0][i] + B[0][i - 1].info), rightCount: i };
B[i][0] = { info: (arr[i][0] + B[i - 1][0].info), rightCount: 0 };
}
for (let i = 1; i < arr.length; i++) {
for (let j = 1; j < arr.length; j++) {
if(B[i-1][j].rightCount >= 3){
B[i][j] = { info: arr[i][j] + B[i][j - 1].info, rightCount: B[i][j - 1].rightCount + 1 }
continue;
}
if(B[i][j-1].rightCount == 2){
B[i][j] = { info: arr[i][j] + B[i - 1][j].info, rightCount: 0 }
continue;
}
if (B[i - 1][j].info >= B[i][j - 1].info) { // top
B[i][j] = { info: arr[i][j] + B[i - 1][j].info, rightCount: 0 }
}
else if(B[i][j-1].info > B[i-1][j].info)
{
B[i][j] = { info: arr[i][j] + B[i][j - 1].info, rightCount: B[i][j - 1].rightCount + 1 }
}
}
}
console.log(B[arr.length - 1][arr.length - 1].info)
}
const init2DArr = (n: number, m: number) => {
let res = Array(n);
for (let i = 0; i < res.length; i++) {
res[i] = Array(m)
}
return res;
}
但是这段代码并不完整,因为对于这个输入:
getMaxPath([[1,1,1,1],
[7,9,4,2000],
[6,22,1,1],
[1,1,1,1]])
2000 不包含在路径中,即使路径:
1 -> 1 -> 9 -> 4 -> 2000 -> 1 -> 1
显然是最大值。
因此代码应该返回 2017(路径的总和)。
意思是我的代码没有对所有可能的路径进行评估。 任何帮助将不胜感激
【问题讨论】:
-
只是一个问题,还需要检查是否真的相关,数组中是否允许负数?
-
是的,允许负数
-
为什么不
1 1 9 4 2000 1 1? -
@NinaScholz 见规则 2
-
但是为什么
1 1 1?
标签: javascript node.js arrays typescript algorithm