zoukankan      html  css  js  c++  java
  • 二维数组求子数组之和最大值(首尾相接, 圆柱)

    问题:求二维数组的子数组之和的最大值(首尾相接,即形成圆柱)

    成员

    陈晨:负责代码复审和代码测试计划

    王颖瑞:负责程序分析,代码编程

    思路:对于这个问题,我们可以结合之前的实验(二维数组求子数组之和的最大值和首尾相连一维数组的子数组之和的最大值),把为二维数组的列扩大二倍,之后想一维数组(首尾相连)一样,把二维数组分成不同的几个二维数组。之后就分开求不同的二维数组的子数组的最大值,最后之间比较,求出总的最大值。

    代码

    #include<iostream>
    using namespace std;
    void main ()
    {
    	int x,y,i,j,m=0,n,A[100][100]={0};
    
    	cout<<"输入矩阵的行和列";
    	cin>>x>>y;
    	if(x>100||x<0||y>100||y<0)
    	{
    		cout<<"输入错误,请重新输入";
    		cin>>x>>y;
    
    	}
    	for(i=0;i<x;i++)
    	{
    		for(j=0;j<y;j++)
    		{
    			cin>>A[i][j];
    			A[i][j+y]=A[i][j];
    		}
    
    	}
    	int sum[100]={0},max,result=A[0][0];
    	n=0;
    	while (n<x)
    	{
    		for(i=0;i<x;i++)//确定子数组的最大上界(为第i行)
    		{
    			while(m+i<x)//确定子数组有m+i行
    			{
    				//把子数组当成一位数组一样,求最大子数组的和
    				for(j=n;j<y+n;j++)
    				{
    					sum[j]=sum[j]+A[m+i][j];
    
    				}
    				max=0;
    				for(j=n;j<y+n;j++)
    				{
    					if(max+sum[j]>sum[j])
    					{
    						max=max+sum[j];
    					}
    					else
    					{
    						max=sum[j];
    					}
    					if(max>result)
    					{
    						result=max;
    					}
    				}
    				m++;//是子数组的行数+1
    			}
    			//初始化m和sum[]的值,使子数组最大上界下降1,之后重新循环。
    			m=0;
    			for(j=n;j<y+n;j++)
    			{
    				sum[j]=0;
    			}
    				
    		}
    		n++;
    } cout<<result<<" "; }

      截图

    总结:这次作业主要是对之前的两次实验进行结合,而且在他们结合的基础上,进行优化。通过这次实验,我们之间更加默契,也积累了不少的经验。

  • 相关阅读:
    《构建之法》第8、9、10章 读后感
    [团队项目]SCRUM项目6.0 7.0 (新)
    [团队项目]SCRUM项目5.0
    [团队项目]SCRUM项目4.0
    [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
    [操作系统]实验三 进程调度模拟程序
    [团队项目] Scrum 项目 2.0 产品BACKLOG
    复利计算的总结
    复利/单利计算程序进度0321更新
    0312 复利计算器2.0 运行与介绍
  • 原文地址:https://www.cnblogs.com/double1/p/4440993.html
Copyright © 2011-2022 走看看