您的位置:首页 > 其它

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

2016-04-02 22:02 381 查看
今天参加了腾讯在线笔试,题目不是很难,但是自己做的不好,前面的有些知识点是自己不太熟悉,属于不用就忘,仅仅回想起一点肯定是不够用的。

以前一直以为,到大学之后,所有知识点都可以不再记了,会用就好(用多了确实就记住了),或者用过之后,有个印象,到再需要用的时候再”找回来”就可以了。但是很多知识点是不会经常用的,而真正用到的时候,再去”找回来”成本其实还挺高的,甚至还要付出很大的代价(比如考试的时候)。所以对于不常用的知识点还是需要偶尔复习复习。

今天编程题,最后一道是动态规划的,当时没弄出来,等到结束之后,马上打开eclipse,几分钟就搞定了。下面总结一下这个题,也算复习一下动态规划。

题目:

输入一个矩阵num[m]
,现在从左上角(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]
;
for(int jj=0;jj<n;jj++){
for(int ii=0;ii<m;ii++){
if(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;
}


今天写下来,也算是为自己总是不喜欢做笔记提个醒吧。另外也提醒自己应该多复习复习学过的知识点。像这种面试题,你说不会吧,其实基本都会,但是你写不出来(特别是在考试的时候写不出来)就等于不会。就算学习能力强也没什么用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: