题面:
解题思路:
最大的子矩阵和要么在前面,要么在后面,要么在中间,取两个变量m,max,m为不断累加的值,累加到小于等于0时就置零,保证后面加到的数不受前面影响。在累加过程中由max存最大的m值。
对矩阵的数据处理:
a[i][j] += a[i][j-1];// a[i][j]保存第i行1~j列数值之和
或者 a[i][j] += a[i-1][j]//a[i][j]保存第j列1~i行数值之和
通过三层循环依次计算每个矩阵的和 m += a[k][j] - a[k][i] 或者 m+= a[j][k] - a[i][k];
代码:
#include<iostream> #include<algorithm> using namespace std; int main(){ int N,map[101][101]; cin>>N; for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ cin>>map[i][j]; map[i][j] += map[i][j-1];//map[i][j]表示第i行 ,1到j列的数值之和 } } int max=-1,m=0; for(int i=0;i<N;i++){//一行内的左开始 for(int k=i+1;k<=N;k++){//一行内的右开始 m=0; for(int j=1;j<=N;j++){ m+=map[j][k]-map[j][i]; if(m>max) max=m; if(m<0) m=0; } } } cout<<max<<endl; }
标签:map,子阵,int,max,矩阵,累加,HZOJ,要么,动态 From: https://www.cnblogs.com/anaxiansen/p/17004657.html