爱奇艺 爬山收集钻石问题 算法岗 编程题第一题

动态规划,但是无法确定f(0),所以只能遍历所有可能的f(0),笨方法,求指教!
    /*爱奇艺,算法第一题,f(i)=f(i-1)+max(dia[i][上],dia[i][左上])*/
    public static int climb(int[][] num, int n) {
        if (num.length == 0)
            return 0;
        //输入时从山顶开始的,需要先转换使得小坐标是山底,这里注意从山底到山顶爬山的过程,
        //更从山顶到山底下山的过程不同!
        int[][] dia = new int[n][n];
        for (int i = 0; i < num.length; i++) {
            dia[i] = num[n - i - 1];
        }

        //f(0)初始值不确定,所以遍历所有起点,最终选择最大值的路径
        int result = 0;
        for (int m = 0; m < n; m++) {
            int[] sum = new int[n]; //sum[i]表示爬i层的最大直
            int[] max_index = new int[n]; //每行走点的下标

            max_index[0] = m;

            sum[0] = dia[0][max_index[0]];

            for (int i = 1; i < n; i++) {
                max_index(dia, max_index, i);
                if (max_index[i] + 1 < 0)
                    sum[i] = sum[i - 1] + Math.max(dia[i][max_index[i]], dia[i][max_index[i] + 1]);
                else
                    sum[i] = sum[i - 1] + dia[i][max_index[i]];
            }

            if (sum[n - 1] > result)
                result = sum[n - 1];
        }
        System.out.println("result:" + result);
        return result;

    }

    //更新max_index,存floor层走的那边坐标
    private static void max_index(int[][] num, int[] max_index, int floor) {
        if (max_index[floor - 1] - 1 < 0)
            max_index[floor] = max_index[floor - 1];
        else if (max_index[floor - 1] >= num[floor].length) {
            max_index[floor] = max_index[floor - 1] - 1;
        } else {
            int a = num[floor][max_index[floor - 1]];
            int b = num[floor][max_index[floor - 1] - 1];
            max_index[floor] = a <= b ? max_index[floor - 1] - 1 : max_index[floor - 1];
        }
    } 
全部评论
有没有更好的解法,拿出来交流啊。
点赞 回复 分享
发布于 2017-09-10 22:12
经典的dp问题。
点赞 回复 分享
发布于 2017-09-10 22:30

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
专心打鱼:互联网搬运工,贴子都要偷
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务