UVA 10827 Maximum sum on a torus 最大矩阵和
题目链接:UVA - 10827
题意描述:给出一个n*n矩阵,把第一行和最后一行粘一起,把第一列和最后一列粘一起,形成一个环面,求出这个环面中最大的矩阵和。
算法分析:首先复制n*n这个矩阵,形成由4个这样小矩阵组成的大矩阵,然后在这个大矩阵里找出最大矩阵和,一看貌似和poj1050这道题有些相似,但是这道题数据大一些,O(150^4)应该会超时吧。我们可以这样想,先枚举这个最大和矩阵的左上角在大矩阵中的位置,然后枚举最大和矩阵的行数和列数,在枚举过程中处理最大和,然后更新答案即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #define inf 0x7fffffff 8 using namespace std; 9 const int maxn=160; 10 11 int n,an[maxn][maxn]; 12 int r[maxn],c[maxn]; 13 14 int main() 15 { 16 int t; 17 scanf("%d",&t); 18 while (t--) 19 { 20 scanf("%d",&n); 21 for (int i=1 ;i<=n ;i++) 22 { 23 for (int j=1 ;j<=n ;j++) 24 { 25 scanf("%d",&an[i][j]); 26 an[i+n][j]=an[i][j+n]=an[i+n][j+n]=an[i][j]; 27 //构成了四个小矩阵形成的大矩阵 28 } 29 } 30 memset(r,0,sizeof(r)); 31 memset(c,0,sizeof(c)); 32 int ans=0; 33 //x 和 y枚举最大和矩阵的左上角在第一个小矩阵中的位置 34 for (int x=1 ;x<=n ;x++) 35 { 36 for (int y=1 ;y<=n ;y++) 37 { 38 for (int j=0 ;j<n ;j++) 39 { 40 for (int i=0 ;i<n ;i++) 41 { 42 c[i]=an[x+i][y+j]; 43 if (i) c[i] += c[i-1]; 44 if (!j) r[i]=c[i]; 45 else r[i] += c[i]; 46 47 if (r[i]>ans) ans=r[i]; 48 } 49 } 50 } 51 } 52 printf("%d\n",ans); 53 } 54 return 0; 55 }