讲解:
这个时候我们无法像第一次二维那样直接画图找规律了(当然聪明的同学可能依然能画出,但四维,五维呢?)这个时候我们就需要来推理了思考了。
我们用 f[i][j][k]来表示蒜头君当前所在位置,我们可以知道蒜头君是一步到达这个位置的。我们可以知道蒜头君每次移动只会更改i , j ,k的一个值。这个时候我们就可以知道当前位置会来自 f[i-1][j][k],f[i][j - 1][k],f[i][j][k -1]这三个位喜。
所以我们我们只需要找到前三个状态的最小值,然后在加上当前位署消耗的体力值,就是蔬头君到认当前位置需要消耗体力的最小值。
最终我们可以得到下面的递推式:
f[i][j][k] = min(f[i - 1][j][k], f[i][j - 1][k], f[i][j][k - 1]+ f[i][j][k]
这一步我们先写出三层 for 循环,然后定义一个变量(井初始化为正无穷),保存转移过来三个状态的最小值。
请在 return 0;上面写下:
for(int i=0;i <= x;++i){
for(int j=0;j <= y ;++j){
for(int k=0;k <= z;++k){
int mi = inf;
}
}
}
输入案例:
2 2 2
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
输出案例:
23
import java.util.*; public class LANQIAO1 { public static final int N = (int) (1e2 + 9); public static final int inf = 1000000000; public static int[][][] f = new int[N][N][N]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); int y = sc.nextInt(); int z = sc.nextInt(); // xx for (int i = 0; i <= x; i++) { for (int j = 0; j <= y; j++) { for (int k = 0; k <= z; k++) { f[i][j][k] = sc.nextInt(); } } } for (int i = 0; i <= x; i++) { for (int j = 0; j <= y; j++) { for (int k = 0; k <= z; k++) { int mi = inf; // 用三个if 因为有可能发三种情况同时出现 // 接下来三步我们需要找到上三个状态的最小值,这里我们先找 f[i-1]是否是最小值。 if(i != 0){ mi = Math.min(mi,f[i-1][j][k]); } if(j != 0){ mi = Math.min(mi,f[i][j - 1][k]); } if(k != 0){ mi = Math.min(mi,f[i][j][k - 1]); } // 然后我们把最小值加给 f[i][j][k],到这我们就算是完成了 if(mi != inf){ f[i][j][k] += mi; } } } } System.out.println(f[x][y][z]); } }