结对小组:张永&吴盈盈

每到周一,建民老师都会在课堂上留下一个引人深思的问题。题目:求一个二维数组中子数组和最大的子数组,子数组只要由连续的元素组成即可。

例如:

对这个题目的分析:

  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为端点,再寻找到第三大的值得路径。

把所有的正数都遍历一遍,得到的连续的字块的值就是最大的。

  

Copyright © 2024 我编程我快乐
Powered by .NET 8.0 on Kubernetes