环面上的最大和 (Maximum sum on a torus,UVa 10827)

 1 #include <iostream>
 2 #include <string.h>
 3 #include <string>
 4 #include <fstream>
 5 #include <algorithm>
 6 #include <stdio.h>
 7 #include <vector>
 8 #include <queue>
 9 #include <set>
10 #include <cmath>
11 using namespace std;
12 const double eps = 1e-8;
13 const int INF=0x7fffffff;
14 #define MAXN 76
15 int s[MAXN][MAXN][MAXN];
16 int a[MAXN][MAXN];
17 int main()
18 {
19     int n,T;
20     scanf("%d",&T);
21     while(T--)
22     {
23         scanf("%d",&n);
24         memset(s,0,sizeof(s));
25         for(int i=0;i<n;i++)
26             for(int j=0;j<n;j++)
27             {scanf("%d",&a[i][j]);
28             s[i][j][j]=a[i][j];}
29         for(int x=0;x<n;x++)
30         {
31             for(int y=0;y<n;y++)
32             for(int l=1;l<n;l++)
33                 s[x][y][(y+l)%n]=s[x][y][(y+l-1)%n]+a[x][(y+l)%n];
34 
35         }
36         int Max=-INF;
37         int Min=0,ans=0;
38         for(int y1=0;y1<n;y1++)
39         for(int y2=0;y2<n;y2++)
40         {
41 
42             for(int x=0;x<n;x++)
43             {   ans=0;
44                 for(int y=0;y<n;y++)
45                 {
46                 ans+=s[(x+y)%n][y1][y2];
47                 Max=max(Max,ans);
48                 //Min=min(Min,s[x][y1][y2]);
49                 }
50 
51             }
52         }
53         printf("%d\n",Max);
54         /*cout<<endl;
55         for(int i=0;i<n;i++)
56         {
57          for(int j=0;j<n;j++)
58          cout<<a[i][j]<<' ';
59          cout<<endl;
60         }
61         for(int x=0;x<n;x++)
62         {cout<<x<<endl;
63             for(int y=0;y<n;y++)
64             {for(int l=0;l<n;l++)
65             cout<<s[x][y][(y+l)%n]<<' ';
66             cout<<endl;}
67         }*/
68 
69     }
70     return 0;
71 }

虽然过了 但空间优化不好~ 只需要一个一维数组维护状态即可

posted @ 2013-07-18 10:33  TO_Asia  阅读(320)  评论(0编辑  收藏  举报