1 /*
 2 1768:最大子矩阵-http://noi.openjudge.cn
 3 思想很巧妙,将二维的转换为一维的;用DP不一定直接就能够用。
 4 如果时间复杂度比较高,那么一般就是错的。 
 5 */
 6 
 7 #include<iostream>
 8 #include<cstring>
 9 using namespace std;
10 const int MAXN=102;
11 int g[MAXN][MAXN];
12 int arr[MAXN];
13 int maxnum(int arr[],int n)
14 {
15     int sum[MAXN];
16     sum[0]=arr[0];
17     int max=sum[0];
18     for(int i=1;i<n;i++)
19     {
20         if(sum[i-1]>0)
21         {
22             sum[i]=sum[i-1]+arr[i];
23         }
24         else
25         {
26             sum[i]=arr[i];
27         }
28         if(max<sum[i])
29             max=sum[i];
30     }
31     return max;
32 }
33 int main()
34 {
35     int n;
36     cin>>n;
37     for(int i=0;i<n;i++)
38     {
39         for(int j=0;j<n;j++)
40         {
41             cin>>g[i][j];
42         }
43     }
44     int max=g[0][0];
45     for(int i=0;i<n;i++)
46     {
47         memset(arr,0,sizeof(arr));
48         for(int j=i;j<n;j++)
49         {
50             for(int k=0;k<n;k++)
51                 arr[k]+=g[j][k];
52             int tp=maxnum(arr,n);
53             if(max<tp) max=tp;
54         }
55     }
56     cout<<max<<endl;
57     return 0;
58 } 

上面的是参考别人的,下面的是一开始自己做的,时间复杂度太高了,所以是time limit。

 1 #include<iostream>
 2 #include<cstring> 
 3 using namespace std;
 4 const int MAXN=102;
 5 int g[MAXN][MAXN];
 6 int d[MAXN][MAXN][MAXN][MAXN];
 7 int main()
 8 {
 9     int n;
10     cin>>n;
11     int max=0;
12     for(int i=1;i<=n;i++)
13     {
14         for(int j=1;j<=n;j++)
15         {
16             cin>>g[i][j];
17             d[i][j][1][1]=g[i][j];
18             if(g[i][j]<0)
19                 max+=g[i][j];
20         }
21     }
22     
23     int c,r;
24     for(int i=1;i<=n;i++)
25     {
26         for(int j=1;j<=n;j++)
27         {
28             for(c=1;c<j;c++)
29             {
30                 d[i][j][1][c+1]=d[i][j-1][1][c]+g[i][j];
31                 if(max<d[i][j][1][c+1])
32                     max=d[i][j][1][c+1];
33             }
34             
35             for(r=1;r<=i-1;r++)
36             {
37                 for(c=1;c<=j;c++)
38                 {
39                     d[i][j][r+1][c]=d[i-1][j][r][c]+d[i][j][1][c];
40                     if(max<d[i][j][r+1][c])
41                         max=d[i][j][r+1][c];
42                 }
43             }
44         }
45     }
46     cout<<max<<endl;
47     
48     return 0;
49 }

 

 posted on 2019-03-29 08:09  Goven  阅读(95)  评论(0)    收藏  举报