结对小组:张永&吴盈盈
每到周一,建民老师都会在课堂上留下一个引人深思的问题。题目:求一个二维数组中子数组和最大的子数组,子数组只要由连续的元素组成即可。
例如:
对这个题目的分析:
1.首先应该对个二维数组遍历一遍,求出二维数组中所有的正数,并记录每个正数所对应的位置(行号和列号);
2.对遍历到的所有的正数进行排序(由大到小),要求只要连续的字块的和的最大值,首先从二维数组中最大的正数(设为a)开始找。找a到次大的正数(设为b)之间的一条路径,这条路径满足的条件是,路径上所有元素的和加起来的绝对值要小于b;
这个路径不一定是最近的。
下面的问题就转到了求两点之间的最短路径问题,我们可以借助A*算法来计算。
A*算法的伪代码:
创建两个表,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为端点,再寻找到第三大的值得路径。
把所有的正数都遍历一遍,得到的连续的字块的值就是最大的。