动态规划求解从矩阵左上角到右下角的最大受益问题

今天参加了腾讯在线笔试,题目不是很难,但是自己做的不好,前面的有些知识点是自己不太熟悉,属于不用就忘,仅仅回想起一点肯定是不够用的。
以前一直以为,到大学之后,所有知识点都可以不再记了,会用就好(用多了确实就记住了),或者用过之后,有个印象,到再需要用的时候再”找回来”就可以了。但是很多知识点是不会经常用的,而真正用到的时候,再去”找回来”成本其实还挺高的,甚至还要付出很大的代价(比如考试的时候)。所以对于不常用的知识点还是需要偶尔复习复习。
今天编程题,最后一道是动态规划的,当时没弄出来,等到结束之后,马上打开eclipse,几分钟就搞定了。下面总结一下这个题,也算复习一下动态规划。

题目:
输入一个矩阵num[m][n],现在从左上角(num[0][0])到达右下角num[m-1][n-1],且只能向下或者向右走。定义经过的所有点的数字之和为该条路径的收益,求到达右下角的最大收益。
求解:
用动态规划的方法,从左上角开始,计算到达每一个点的最大收益。

/**
     * 用动态规划方法计算:
     * 用一个数组result[i][j]保存每一个点i,j的最大收益
     *              num[i][j],                                    i=j=0
     * result[i][j]=result[i][j-1]+num[i][j],                     i=0,j!=0
     *              result[i-1][j]+num[i][j],                     j=0,i!=0
     *              Max(result[i-1][j],result[i][j-1])+num[i][j], i!=0,j!=0
     * 
     * @param num 非空数组num
     * @return 
     */
    public static int[][] getMax(int[][] num){
        int m=num.length;
        if(m==0){//说明数组num为空
            return new int[0][0];
        }
        int n=num[0].length;
        int[][] result=new int[m][n];
        for(int jj=0;jjfor(int ii=0;iiif(ii==0 && jj==0){
                    result[ii][jj]=num[ii][jj];
                    continue;
                }
                if(jj==0){
                    result[ii][jj]=result[ii-1][jj]+num[ii][jj];
                    continue;
                }
                if(ii==0){
                    result[ii][jj]=result[ii][jj-1]+num[ii][jj];
                    continue;
                }
                int maxIJ=Math.max(result[ii][jj-1],result[ii-1][jj]);
                result[ii][jj]=maxIJ+num[ii][jj];
            }
        }
        return result;
    }

今天写下来,也算是为自己总是不喜欢做笔记提个醒吧。另外也提醒自己应该多复习复习学过的知识点。像这种面试题,你说不会吧,其实基本都会,但是你写不出来(特别是在考试的时候写不出来)就等于不会。就算学习能力强也没什么用。

你可能感兴趣的:(经验之谈,算法学习)