• 结对开发求二维数组值最大的子数组(只要连续即可)


    结对小组:张永&吴盈盈

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

    例如:

    对这个题目的分析:

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

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

      

  • 相关阅读:
    提取多层嵌套Json数据
    Jquery 使用Ajax获取后台返回的Json数据后,页面处理
    Jquery购物车jsorder改进版,支持后台处理程序直接转换成DataTable处理
    长连接和短连接
    JAVA8新特性
    线程、进程与程序+并行与并发
    订单号生成规则
    散列表解决冲突的方式
    125.Valid Palindrome
    128.Longest Consecutive Sequence
  • 原文地址:https://www.cnblogs.com/zhangyongJava/p/3629866.html
Copyright © 2020-2023  润新知