zoukankan      html  css  js  c++  java
  • 返回一个二维整数数组中最大联通子数组的和

      程序设计思路:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组。再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标。这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到;第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价。最后得到的就是最大联通子数组的和。

      程序源代码:

      1 package 最大子数组;
      2 
      3 import java.util.Scanner;
      4 
      5 public class judge2 {
      6 
      7     public static void main(String[] args) {
      8         // TODO Auto-generated method stub
      9 
     10 
     11         int m,n,i,j,t2;
     12         Integer smark=new Integer(0);
     13         Integer mmark=new Integer(0);
     14 
     15         int sum;
     16 
     17         int up[]=new int[100];
     18         int down[]=new int[100];
     19         int t[]=new int[100];
     20         int a[][]=new int[100][100];
     21         int b[]=new int[100];
     22             
     23         System.out.println("请输入二维数组的行数和列数:");
     24          Scanner scanner=new Scanner(System.in);
     25         m=scanner.nextInt();
     26         n=scanner.nextInt();
     27         System.out.println("请输入这个二维矩阵:");
     28         
     29         for(i=0;i<m;i++)
     30 
     31         {
     32 
     33             for(j=0;j<n;j++)
     34 
     35             {
     36 
     37                 a[i][j]=scanner.nextInt();;
     38 
     39             }
     40 
     41         }
     42 
     43         //把二维数组按行分解为几个一维数组
     44         for(i=0;i<m;i++)
     45 
     46         {
     47 
     48             for(j=0;j<n;j++)
     49 
     50             {
     51 
     52                 b[j]=a[i][j];
     53 
     54             }
     55 
     56             sum=Max(n,b,smark,mmark);
     57 
     58             up[i]=smark;                                    
     59 
     60             down[i]=mmark;
     61 
     62             t[i]=sum;
     63 
     64      
     65 
     66         }
     67 
     68         t2=t[0];
     69 
     70         for(i=0;i+1<m;i++)
     71 
     72         {
     73 
     74             if(up[i]<=down[i+1] && down[i]>=up[i+1])
     75 
     76             {
     77 
     78                 t2+=t[i+1];
     79 
     80             }
     81 
     82              for(j=up[i];j<up[i+1];j++)
     83 
     84             {
     85 
     86                 if(a[i+1][j]>0) t2+=a[i+1][j];                   //判别独立正数
     87 
     88             }
     89 
     90      
     91 
     92         }
     93 
     94         System.out.println(t2);   
     95     }
     96     public static int Max(int n,int a[],Integer smark,Integer mmark)
     97 
     98     {
     99 
    100         int b[]=new int [100];
    101 
    102         int i,sum1= Integer.MIN_VALUE,max1=0;
    103         int j=0;
    104         for(i=0;i<n+j;i++)
    105 
    106         {
    107 
    108             if(sum1<0)
    109 
    110             {
    111 
    112                 sum1=a[i%n];
    113                 j=i;
    114             }
    115 
    116             else
    117 
    118             {
    119 
    120                 sum1=sum1+a[i%n];
    121 
    122             }
    123            
    124             b[i]=sum1;
    125 
    126         }
    127 
    128         max1=b[0];
    129       
    130         for(i=0;i<n+j;i++)
    131 
    132         {
    133 
    134             if (max1<b[i]) 
    135 
    136              {
    137 
    138                  max1= b[i];
    139 
    140                  mmark = i;
    141                 
    142 
    143              }
    144             
    145         }
    146 
    147          for (i = mmark;i >= 0;i--) 
    148 
    149         {
    150 
    151             if (b[i] == a[i]) 
    152 
    153             {
    154 
    155                  smark = i;
    156 
    157                  break;
    158 
    159             }
    160 
    161         }
    162 
    163          return max1;
    164 
    165     }
    166 }
    167         

      程序运行结果截图:

  • 相关阅读:
    UVa 1451 Average (斜率优化)
    POJ 1160 Post Office (四边形不等式优化DP)
    HDU 3507 Print Article (斜率DP)
    LightOJ 1427 Substring Frequency (II) (AC自动机)
    UVa 10245 The Closest Pair Problem (分治)
    POJ 1741 Tree (树分治)
    HDU 3487 Play with Chain (Splay)
    POJ 2828 Buy Tickets (线段树)
    HDU 3723 Delta Wave (高精度+calelan数)
    UVa 1625 Color Length (DP)
  • 原文地址:https://www.cnblogs.com/wangfengbin/p/6675256.html
Copyright © 2011-2022 走看看