二维数组求子数组的最大和(严晓雄 刘三龙)

本文介绍了一个通过遍历二维数组来寻找最大子数组和的算法实现。该算法使用多个嵌套循环,针对不同方向的子数组求和,并将最大值记录下来。

                                     在这个程序中,我们首先设置了俩个二维数组,a[m][n]和b[m][n]。a[m][n]用来存储输入的数组,数组存入后,

                  我运用for循环依次对数组进行遍历,遍历的过程就是求以当前数为左顶角的所有字数组的最大值,然后将最大值存入坐标相对应的

                  b数组中。对数组a遍历完后再对b数组进行遍历求数组b的最大值max,max值就是所求的最大子数组的值。

下面是程序代码和运行结果:

 

 

#include "stdafx.h"

#include "stdio.h"

int m;

 int max;

 

void Max0(int a[][3])

{

       int i,j,k,m,sum,b[100];

       m=0;

        for(i=0;i<3;i++)

       {  

             

              for(j=0;j<2;j++)

              {  

                     sum=a[i][j];

                     for(k=j+1;k<3;k++)

                     {

                        sum=sum+a[i][k];

                        b[m++]=sum;

                     }

              }

       }

       for(i=0;i<3;i++)

       {  

             

              for(j=0;j<2;j++)

              {  

                     sum=a[j][i];

                     for(k=j+1;k<3;k++)

                     {

                        sum=sum+a[k][i];

                        b[m++]=sum;

                     }

              }

       }

       for(i=0;i<2;i++)

       {  

             

              for(j=0;j<2;j++)

              {  

                     sum=a[i][j]+a[i+1][j];

                     for(k=j+1;k<3;k++)

                     {

                        sum=sum+a[i][k]+a[i+1][k];

                        b[m++]=sum;

                     }

              }

       }

       for(i=0;i<2;i++)

       {  

             

              for(j=0;j<2;j++)

              {  

                     sum=a[j][i]+a[j][i+1];

                     for(k=j+1;k<3;k++)

                     {

                        sum=sum+a[k][i]+a[k][i+1];

                        b[m++]=sum;

                     }

              }

       }

       for(i=0;i<1;i++)

       {  

             

              for(j=0;j<2;j++)

              {  

                     sum=a[i][j]+a[i+1][j]+a[i+2][j];

                     for(k=j+1;k<3;k++)

                     {

                        sum=sum+a[i][k]+a[i+1][k]+a[i+2][k];

                        b[m++]=sum;

                     }

              }

       }

       for(i=0;i<1;i++)

       {  

             

              for(j=0;j<2;j++)

              {  

                     sum=a[j][i]+a[j][i+1]+a[j][i+2];

                     for(k=j+1;k<3;k++)

                     {

                        sum=sum+a[i][k]+a[k][i+1]+a[k][i+2];

                        b[m++]=sum;

                     }

              }

       }

           for(i=0;i<3;i++)

              {  

             

                 for(j=0;j<3;j++)

                     { 

                        b[m++]=a[i][j];

                     }

              }

    max=b[0];

       for(i=0;i<m;i++)

       {

              if(max<=b[i])

              {

                     max=b[i];

              }

       }

 

       printf("最大子数组和为:%d\n",max);

}

      

int main(int argc, char* argv[])

{

       int num[3][3];

       int i,j;

       printf("请输入九个数:\n");

       for(i=0;i<3;i++)

       {

              for(j=0;j<3;j++)

              {

                     scanf("%d",&num[i][j]);

              }

       }

       printf("生成的数组矩阵为:\n");

           for(i=0;i<3;i++)

       {

              for(j=0;j<3;j++)

              {

                     printf("%d     ",num[i][j]);

                     if(j==2)

                                   {

                                          printf("\n\n");

                                   }

              }

             

       }

       Max0(num);

       return 0;

}

 

转载于:https://www.cnblogs.com/wafyxx/p/3608921.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值