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;
    }

    运行结果如下:

  • 相关阅读:
    05-Selenium的三种等待
    04-selenium 八大元素定位方法
    03-Selenium简单操作
    python-利用json模块处理json数据几个函数总结
    python-利用pymysql获取数据简单使用总结
    python-利用faker模块生成测试数据
    python-利用random模块生成测试数据封装方法总结
    python-利用shutil模块rmtree方法可以将文件及其文件夹下的内容删除
    pytest--配置用例执行顺序(pytest_ordering插件介绍)
    pytest--mark基本使用(主要通过pytest.ini文件注册标签名,对用例进行标记分组)
  • 原文地址:https://www.cnblogs.com/lixialei/p/3611949.html
Copyright © 2011-2022 走看看