返回一个二维整数数组中最大联通子数组的和
Posted 风飘万点江满月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回一个二维整数数组中最大联通子数组的和相关的知识,希望对你有一定的参考价值。
程序设计思路:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组。再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标。这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到;第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价。最后得到的就是最大联通子数组的和。
程序源代码:
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
程序运行结果截图:
以上是关于返回一个二维整数数组中最大联通子数组的和的主要内容,如果未能解决你的问题,请参考以下文章