从一维的最大子序列 , 到二维的最大子序列 , 实际上还是转化为一维的去计算 , 通过输入时获得操作 , 和下面的 三个 for 循环 得以 计算最大子序列 /
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 using namespace std; 16 int main() 17 { 18 int t,a[2][6],n,m; 19 scanf("%d",&t); 20 while(t--) 21 { 22 scanf("%d%d",&n,&m); 23 memset(a,0,sizeof(a)); 24 for(int i=1;i<=n;i++) 25 for(int j=1;j<=m;j++) 26 { 27 scanf("%d",&a[i][j]); 28 a[i][j]=a[i][j]+a[i-1][j]; // 这里是一个重要的处理 , 让下面的数据 , 代表该数据及以上数据之和 便于下方计算 29 } 30 int temp,result=INT_MIN; 31 for(int i=1;i<=n;i++) // 通过这三个 for 循环 得以计算到 最大值的最小子序列 . 32 for(int j=i;j<=n;j++) 33 for(int k=1,maxn=INT_MIN;k<=m;k++) 34 { 35 temp=a[j][k]-a[i-1][k]; 36 maxn=(maxn>0?maxn:0)+temp; 37 result=maxn>result?maxn:result; 38 } 39 printf("%d\n",result); 40 } 41 return 0; 42 }