zoukankan      html  css  js  c++  java
  • 求二维数组的最大子集和

    小组成员(李夏蕾  杨世超)

    这次的题目是接着上次的一维数组进行的进一步的引申,虽然考虑了很多的方法,但还是觉得穷举法是最保险的一种,下面是我们的思路:

    我们采用的是自己输入行数和列数,然后输入数据进行测试。同时申请了两个数组用来存放子集的长度和宽度,好用来输出。

         主要的就是for循环了,首先是最外层的,先从i=0开始,当j=0时,先将包含a[0][0]的所有子集都遍历一遍,并求出最大值,记录下来,然后是a[0][1],如此循环下去。在循环中利用的是一维数组求最大子集的方法,不同的是在其中加入了for(x=0;x<row;x++),让其可以把下一行也遍历,因为是矩形数组,所以要考虑行和列。

    而在遍历过程中,通过比较max的值,让其在每一个数据中找出一个最大的,同时记录下最大值的行长度和列长度以便输出。对于子数组的输出也和一维数组相同,只是改为二维的而已。

    下面是循环模块的代码:

     for(i=0;i<row;i++)
        {
            for(j=0;j<column;j++)
            {
                   max=a[i][j];
                  
                for(m=1;m<=column-j;m++)
                {    sum=0;
                    length=1;
                    line=i;
                    
                    for(x=i;x<row;x++)
                    {                                        
                            for(k=j;k<j+m;k++)
                            {
                                sum=sum+a[x][k];
                            }
                            if(max<=sum)
                            {
                            max=sum;
                            length=m;
                            line=x;    
                            b[i][j]=max;
                             c[i][j]=length;
                            d[i][j]=line;    
                            }
                  
                    }    
                                        
                }
            }
        }

    程序源代码如下:

    #include<iostream>
    using namespace std;
    #define N 100
    int main()
    {
        int row,column;
        int sum,max;
        int i,k,j,t,m,x,n,s;
        int a[N][N],b[N][N],c[N][N],d[N][N];
        int length,line;
        cout<<"请输入数组的行数:"<<endl;
        cin>>row;
        cout<<"请输入数组的列数:"<<endl;
        cin>>column;
        cout<<"请输入数组元素:"<<endl;
        for(i=0;i<row;i++)
        {
            for(j=0;j<column;j++)
            {
                cin>>a[i][j];
            } 
        }
        for(i=0;i<row;i++)
        {
            for(j=0;j<column;j++)
            {
                   max=a[i][j];
                  
                for(m=1;m<=column-j;m++)
                {    sum=0;
                    length=1;
                    line=i;
                    
                    for(x=i;x<row;x++)
                    {                                        
                            for(k=j;k<j+m;k++)
                            {
                                sum=sum+a[x][k];
                            }
                            if(max<=sum)
                            {
                            max=sum;
                            length=m;
                            line=x;    
                            b[i][j]=max;
                             c[i][j]=length;
                            d[i][j]=line;    
                            }
                  
                    }    
                                        
                }
            }
        }
        max=b[0][0];
        t=0;
        n=0;
        for(i=0;i<row;i++)
        {
            for(j=0;j<column;j++)
            {    
                if(max<b[i][j])    
                {
                     max=b[i][j];
                     t=i;
                     n=j;
                }
            }
        }
        cout<<"最大子数组和是:";
        cout<<max<<endl;
        cout<<"子序列为"<<endl;
        for(i=t;i<=d[t][n];i++)
        {
            for(j=n;j<n+c[t][n];j++)
            {
                cout<<a[i][j]<<'\t';
            }
            cout<<endl;
        }
        return 0;
    }

    运行结果如下:

  • 相关阅读:
    证明一下拉普拉斯的《概率分析论》观点
    Android实现小圆点显示未读功能
    命名 —— 函数的命名
    node.js 之爬虫
    ubuntu安装 tensorflow GPU
    古文(诗词文)—— 结构模式与复用
    Win10安装Ubuntu16.04 双系统
    python使用wget下载网络文件
    文字检测与识别资源
    10大深度学习架构:计算机视觉优秀从业者必备
  • 原文地址:https://www.cnblogs.com/lixialei/p/3611949.html
Copyright © 2011-2022 走看看