结对小组:张永&吴盈盈html
每到周一,建民老师都会在课堂上留下一个引人深思的问题。题目:求一个二维数组中子数组和最大的子数组,子数组只要由连续的元素组成便可。算法
例如:数组
对这个题目的分析:htm
1.首先应该对个二维数组遍历一遍,求出二维数组中全部的正数,并记录每一个正数所对应的位置(行号和列号);blog
2.对遍历到的全部的正数进行排序(由大到小),要求只要连续的字块的和的最大值,首先从二维数组中最大的正数(设为a)开始找。找a到次大的正数(设为b)之间的一条路径,这条路径知足的条件是,路径上全部元素的和加起来的绝对值要小于b;排序
这个路径不必定是最近的。class
下面的问题就转到了求两点之间的最短路径问题,咱们能够借助A*算法来计算。遍历
A*算法的伪代码:im
建立两个表,OPEN表保存全部已生成而未考察的节点,CLOSED表中记录已访问过的节点。 算起点的估价值; 将起点放入OPEN表; while(OPEN!=NULL) { 从OPEN表中取估价值f最小的节点n; if(n节点==目标节点){ break; } for(当前节点n 的每一个子节点X) { 算X的估价值; if(X in OPEN) { if( X的估价值小于OPEN表的估价值 ){ 把n设置为X的父亲; 更新OPEN表中的估价值; //取最小路径的估价值 } } if(X inCLOSE) { if( X的估价值小于CLOSE表的估价值 ){ 把n设置为X的父亲; 更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值 } } if(X not inboth){ 把n设置为X的父亲; 求X的估价值; 并将X插入OPEN表中; //尚未排序 } }//end for 将n节点插入CLOSE表中; 按照估价值将OPEN表中的节点排序; //其实是比较OPEN表内节点f的大小,从最 小路径的节点向下进行。 }//end while(OPEN!=NULL) 保存路径,即 从终点开始,每一个节点沿着父节点移动直至起点,这就是你的路径
A*算法详解参考http://www.cnblogs.com/kanego/archive/2011/08/30/2159070.html二维数组
3.而后在以a,b为端点,再寻找到第三大的值得路径。
把全部的正数都遍历一遍,获得的连续的字块的值就是最大的。