给定数据规模的ACM风格笔试题-子矩阵的最大累加和问题
在算法笔试中,一般有两种风格,一种是填函数风格,可以粗暴地理解为Leetcode中提交的风格,另一种是ACM风格,可以认为是要自己写输入输出的风格,比如华为笔试的风格。
如果是ACM风格,尽量不要使用Scanner、System.out,因为他们的IO效率非常慢。
这道子矩阵的最大累加和问题是一道典型的给定数据规模的题目。
代码
public static void main(String[] args) throws IOException{//将文件中的内容load进内存中BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//一个一个读数字StreamTokenizer in = new StreamTokenizer(br);PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));//文件没有结束就继续while(in.nextToken()!=StreamTokenizer.TT_EOF){int n = (int)in.nval;in.nextToken();int m = (int)in.nval;int[][] mat = new int[n][m];for(int i=0;i<n;i++){for(int j = 0;j<m;j++){in.nextToken();mat[i][j]=(int)in.nval;}}out.println(maxSumSubmatrix(mat,n,m));}out.flush();br.close();out.close();}public static int maxSumSubmatrix(int[][] mat,int n,int m){int max = Integer.MIN_VALUE;for (int i=0;i<n;i++){int[] arr = new int[m];for(int j=i;j<n;j++){for(int k=0;k<m;k++){arr[k]+=mat[j][k];}max = Math.max(max,maxSumSubarray(arr,m));}}return max;}public static int maxSumSubarray(int[] arr,int m){int max = Integer.MIN_VALUE;int cur = 0;for(int i=0;i<m;i++){cur+=arr[i];max=Math.max(max,cur);cur = cur<0?0:cur;}return max;}