最大字段和 最大子矩阵(1001

来源:互联网 发布:网络降费提速发布会 编辑:程序博客网 时间:2024/05/16 01:11
题意:求给定方形矩阵的最大子矩阵和思路:这和求最大子段和有关.最大子段和:设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;}}}

原创粉丝点击