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 <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]<<'	';
            }
            cout<<endl;
        }
        return 0;
    }

     

  • 相关阅读:
    json数据在前端(javascript)和后端(php)转换
    几个提高效率的PHOTOSHOP秘密快捷键
    移动端ios针对input虚拟键盘挡住的问题
    前端适配移动端的方法
    完美兼容IE10以下所有版本
    vscode vue文件格式化没效果
    官网顶部的标题左移动
    模拟后台一次性返回所有数据
    关于上传图片的问题
    iframe标签在PC端的使用
  • 原文地址:https://www.cnblogs.com/yangshichao/p/3611989.html
Copyright © 2011-2022 走看看