首页 > 其他 > 详细

求二维数组的最大子集和

时间:2014-03-19 23:18:23      阅读:500      评论:0      收藏:0      [点我收藏+]

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

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

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

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

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

下面是循环模块的代码:

bubuko.com,布布扣
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;    
                }    
                                    
            }
        }
    }
bubuko.com,布布扣

程序源代码如下:

 

bubuko.com,布布扣
#include <stdafx.h>
#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;
}
bubuko.com,布布扣

 bubuko.com,布布扣

求二维数组的最大子集和,布布扣,bubuko.com

求二维数组的最大子集和

原文:http://www.cnblogs.com/yangshichao/p/3611989.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!