No.47-礼物的最大值(Java版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/89380919

1 礼物的最大值

1.1 方法1

public static int getMaxValue(int[][] data) {
        if (data == null) {
            return -1;
        }
        int row = data.length;
        int col = data[0].length;
        int[][] states = new int[row][col];
        states[0][0] = data[0][0];

        // 初始化第一行
        for (int i = 1; i < col; i++) {
            int pre = states[0][i - 1];
            states[0][i] = pre + data[0][i];
        }

        // 初始化第一列
        for (int i = 1; i < row; i++) {
            int pre = states[i - 1][0];
            states[i][0] = pre + data[i][0];
        }

        for (int i = 1; i < row; i++) {
            for (int j = 1; j < col; j++) {
                states[i][j] = Math.max(states[i - 1][j], states[i][j - 1]) + data[i][j];
            }
        }

        return states[row - 1][col - 1];


    }

    public static void main(String[] args) {
        int[][] data =
                {
                        {1, 10, 3, 8},
                        {12, 2, 9, 6},
                        {5, 7, 4, 11},
                        {3, 7, 16, 5}
                };

        int res = getMaxValue(data);
        System.out.println(res);
    }

在这里插入图片描述

1.2 方法2

/**
     * 由于第 i 行的值与第 i-1 行和 i 行有关,对DP进行简化
     */
    public static int getMaxValue_2(int[][] data) {
        if (data == null) {
            return -1;
        }

        int row = data.length;
        int col = data[0].length;
        int[][] states = new int[2][col];

        // false -states 第一行写数据
        boolean flag = true;
        states[0][0] = data[0][0];
        states[1][0] = states[0][0] + data[0][0];
        for (int i = 1; i < col; i++) {  //初始化第一行数据
            states[0][i] = states[0][i - 1] + data[0][i];
        }

        int m = 1;

        while (true) {
            if (flag) {

                if (m == row) {
                    break;
                }

                for (int i = 0; i < col; i++) {
                    if (i == 0) {
                        states[1][0] = states[0][0] + data[m][0];
                    } else {
                        states[1][i] = Math.max(states[0][i], states[1][i - 1]) + data[m][i];
                    }
                }
                ++m;
                flag = false;
            }

            if (!flag) {

                if (m == row) {
                    break;
                }
                for (int i = 0; i < col; i++) {
                    if (i == 0) {
                        states[0][0] = states[1][0] + data[m][0];
                    } else {
                        states[0][i] = Math.max(states[0][i - 1], states[1][i]) + data[m][i];
                    }
                }

                ++m;
                flag = true;
            }
        }

        return Math.max(states[0][col - 1], states[1][col - 1]);
    }

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/89380919