Square Submatrix
题意:
给你个N*N矩阵,(N《=400),找出其子矩阵中左对角线和(左上角到右下角),减右对角线和(左下角到右上角)最大差值。
算法:
普素算法是 O( N * N * N * N )
超时,关键是优化求对角线和算法。
以空间换时间。用两个二维数组保存好对角线和。
O( N * N * N ) ac
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int mp1[410][410]; int mp2[410][410]; int mt[410][410]; int main( ) { int N, M; scanf("%d",&N); while( N-- ) { scanf("%d",&M); for( int i = 1; i <= M; i++) { for( int j = 1; j <= M; j++) { scanf("%d",&mt[i][j]); } } memset(mp1,0,sizeof(mp1)); memset(mp2,0,sizeof(mp2)); for( int i = 1; i <= M; i++) { for( int j = 1; j <= M; j++) { mp1[i][j] = mt[i][j] + mp1[i-1][j-1]; // printf("%d ",mp1[i][j]); } puts(""); } for( int i = 1; i <= M; i++) { for( int j = M; j >= 1; j--) { mp2[i][j] = mt[i][j] + mp2[i-1][j+1]; // printf("%d ",mp2[i][j]); } puts(""); } int maxn = -0x7f7f7f7f; for( int i = 1; i <= M; i++) { for( int j = 1; j <= M; j++) { for( int k = 1; k + i <= M && k + j <= M; k++) { int x = mp1[i+k][j+k] - mp1[i][j] + mt[i][j]; int y = mp2[i+k][j] - mp2[i][j+k] + mt[i][j+k]; maxn = max(maxn, x - y ); } } } printf("%d\n",maxn); } return 0; }
posted on 2012-07-30 16:34 more think, more gains 阅读(230) 评论(0) 编辑 收藏 举报