求二维数组的最大子集和

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

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

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

     主要的就是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;
}

运行结果如下:

posted @ 2014-03-19 17:42  lxlsommer  阅读(439)  评论(0编辑  收藏  举报