题意:求给定方形矩阵的最大子矩阵和
思路:这和求最大子段和有关.
最大子段和:
设int *b存储一组数,int n存储这组数的个数,最大子段和问题是求这组数中子段和的最大值.当所有数均为负数时定义其最大子段和为0
解决办法:动态规划.
int maxsum(int *a,int n){
int b=0;//当前的字段和,将与最大字段和比较,去更新最大子段和
int max=0;//记录数组a的最大子段和,在程序运行过称中会不断更新
int i;//用于在循环过程中计数
for(i=0;i<n;i++){
if(b>0)b=b+a[i];//如果当前的子段和>0,则继续加
else b=a[i];//若<=0,则放弃之前的子段和,使之等于a[i],从i个开始求子段和
if(b>max)max=b;//更新最大字段和
}
return max;
}
最大子矩阵和用到了最大子段和
.假设矩阵是n行n列的,则用数组b[n]存储每列的和值,即b[0]代表第0列的数字的和.但是可能不包括第0列的所有的数.具体请看程序注释.
Int maxmartixsum(int n,int **a){
Int i,j,k,l;//用于在循环过程中计数
for(i=0;i<n;i++){
for(l=0;l<n;l++)b[l]=0;//每一次都应该初始化,从第i行开始说明计算的是从第i行往下的子矩阵的和
for(j=i;j<n;j++){ //令j=i,因为要计算从i行往下的子矩阵的和
for(k=0;k<n;k++){
b[k]+=map[j][k];
} //b[0]是第0列i行到j行之间的数据的和
zmax=maxsum(b,n);//由j=i控制从第i行开始,由此处控制从i开始到n之间的任意一行结束!!!
if(zmax>max)max=zmax;
}
}
}
最大字段和 最大子矩阵(1001
最新推荐文章于 2019-05-18 16:26:08 发布