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
浙公网安备 33010602011771号