NYOJ_104_最大和
首先我们知道一维的时候,可以达到Q(N)的速度,那二维的时候,我们依然可以通过降维来引用1维的做法
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; int map[102][102]; int main() { int i,j,t,k,m,r,c,max,temp; scanf("%d",&t); while(t--) { scanf("%d%d",&r,&c); //r为行 for(i=1;i<=r;++i) for(j=0;j<c;++j) { scanf("%d",&map[i][j]); map[i][j]=map[i][j]+map[i-1][j];//竖着降维 } for(i=1,m=map[1][0];i<=r;++i) //m赋值给第一个元素 for(j=i;j<=r;++j) for(k=max=0;k<c;++k) { temp=map[j][k]-map[i-1][k];//k时,i和j之间的矩阵 max=(max>=0?max:0)+temp;//一维的做法,max记录的是当前两行之间的最大矩阵和 m=max>m?max:m;//m记录的是从前面遍历到这个位置,最大的矩阵和为多少 } printf("%d\n",m); memset(map,0,sizeof(map));//放后面更省时间 } return 0; }