题目描述
AC代码
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示从起点走到第i行第j个元素的所有路径上的数的最小和。
从第
i
−
1
i-1
i−1行到第
i
i
i行,有两种走法:
1.从右上角下来:
f
[
i
]
[
j
]
=
f
[
i
−
1
]
[
j
]
+
n
u
m
s
[
i
]
[
j
]
f[i][j]=f[i-1][j]+nums[i][j]
f[i][j]=f[i−1][j]+nums[i][j]
2.从左上角下来:
f
[
i
]
[
j
]
=
f
[
i
−
1
]
[
j
−
1
]
+
n
u
m
s
[
i
]
[
j
]
f[i][j]=f[i-1][j-1]+nums[i][j]
f[i][j]=f[i−1][j−1]+nums[i][j]
最后枚举最后一行的所有状态值,取最小的作为答案。
我们每次用到的实际上是相邻两行,所以
f
f
f数组可以开成
f
[
2
]
[
n
]
f[2][n]
f[2][n],对于
f
[
i
]
[
j
]
f[i][j]
f[i][j]可以写做
f
[
i
f[i
f[i&
1
]
[
j
]
1][j]
1][j],相当于对
i
i
i进行mod运算。
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int n=triangle.size();
long[][] f=new long [n][n];
f[0][0]=triangle.get(0).get(0);
for(int i=1;i<n;i++){
for(int j=0;j<=i;j++){
f[i][j]=Integer.MAX_VALUE;
if(j<i) f[i][j]=Math.min(f[i][j],f[i-1][j]+triangle.get(i).get(j));
if(j>0) f[i][j]=Math.min(f[i][j],f[i-1][j-1]+triangle.get(i).get(j));
}
}
long res=Integer.MAX_VALUE;
for(int i=0;i<n;i++)
res=Math.min(res,f[n-1][i]);
return (int)res;
}
}