首页 > 代码库 > 返回一个二维整数数组中最大联通子数组的和
返回一个二维整数数组中最大联通子数组的和
程序设计思路:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组。再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标。这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到;第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价。最后得到的就是最大联通子数组的和。
程序源代码:
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
程序运行结果截图:
返回一个二维整数数组中最大联通子数组的和
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。