动态规划-最小值(三维dp)

文章介绍了如何使用递推和三层for循环解决蒜头君在多维空间中的移动问题,通过计算每个位置的最小体力消耗,实现从初始位置到目标位置的路径优化。
摘要由CSDN通过智能技术生成

讲解:
这个时候我们无法像第一次二维那样直接画图找规律了(当然聪明的同学可能依然能画出,但四维,五维呢?)这个时候我们就需要来推理了思考了。
我们用 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]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值