现在的位置: 首页 > 综合 > 正文

poj1050 最大子矩阵和

2013年08月27日 ⁄ 综合 ⁄ 共 687字 ⁄ 字号 评论关闭

        可以归结为一维数组最大子序列和的问题,关键就是要利用一维数组最大子序列和的O(n)解法。

#include <stdio.h>
#include <stdlib.h>

int a[100][100];
int col_sum[100][100][100];
int N;

int to_max(int start_row,int end_row){//一维数组的最大子序列和
	int max=-127*100*100;
	int sum=0;
	int j;
	for(j=0;j<N;j++){
		sum+=col_sum[j][start_row][end_row];
		if(sum>max){
			max=sum;
		}
		if(sum<0){
			sum=0;
		}
	}
	return max;
}

int main(void){
	scanf("%d",&N);
	
	int i;
	int j;
	int k;
	
	for(i=0;i<N;i++){
		for(j=0;j<N;j++){
			scanf("%d",&a[i][j]);
		}
	}
	
	for(j=0;j<N;j++){
		for(i=0;i<N;i++){
			for(k=i;k<N;k++){
				if(k==i){
					col_sum[j][i][i]=a[i][j];
				}else{
					col_sum[j][i][k]=col_sum[j][i][k-1]+a[k][j];
				}
			}
		}
	}
	
	int max=-127*100*100;
	int sum=0;
	for(i=0;i<N;i++){
		for(k=i;k<N;k++){
			sum=to_max(i,k);
			if(sum>max){
				max=sum;
			}
		}
	}
	printf("%d\n",max);
	
	return 0;
}

抱歉!评论已关闭.