• 求一个二维整数数组最大子数组之和,时间复杂度为N^2


    本随笔只由于时间原因,我就只写写思想了
     
    二维数组最大子数组之和,可以  引用  一维最大子数组之和 的思想
    一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了

    我们有一个最初的二维数组a[n][m],找它的 最大子数组之和 

    1.我们先建立一个新的二维数组b[n][m]

      二维数组b[j][k] 存放的是a[j][k](0<=j<n,0<=k<m) 这一点到 a[0][0]  的最大值

    2。循环:从a[0][0]开始 以此是 a[0][1]、 a[0][2]……a[0][m]、
                                              a[1][0]、 a[1][1]……a[1][m]、

                                              a[2][0]、 a[2][1]……a[2][m]、

                                              ……

                                             a[n][0]、 a[n][1]……a[n][m]、

    具体循环工作:

           当循环到a[j][k](0<=j<n,0<=k<m)

            则求的是 a[j][k]到 a[0][0]  的最大值

    计算方法:

               b[j][k]=a[j][k]+b[j-1][k]+b[j][k-1]-b[j-1][k-1]

               若b[j][k]<0,则赋值为0;

               每次计算完成后,都需要与max进行比较

    当然:  二位数组边缘部分循环时需要稍做调整

              当然部分细节也没说到,留给大家自己考虑

    #include<iostream.h>
    int main()
    {
    	int i,j;
    	int a[3][3]={-1,-2,1,-3,4,2,3,4,-5};
    	int b[3][3];
    	int max=a[0][0];
    	for(i=0;i<3;i++)
    	{
    		for(j=0;j<3;j++)
    		{
    			cout<<a[i][j]<<' ';
    		}
    		cout<<endl;
    	}
    	for(i=0;i<1;i++)
    	{
    		b[0][0]=a[0][0];
    		for(j=0;j<3;j++)
    		{
    			if(a[0][j-1]<0)
    			{
    				b[0][j]=a[0][j];
    			}
    			else
    			{
    				b[0][j]=b[0][j-1]+a[0][j];
    			}
    		}
    	}
    	for(i=1;i<3;i++)
    	{
    		for(j=0;j<1;j++)
    		{
    			if(a[i-1][0]<0)
    			{
    				b[i][0]=a[i][0];
    			}
    			else
    			{
    				b[i][0]=b[i-1][0]+a[i][0];
    			}
    		}
    	}
    	for(i=1;i<3;i++)
    	{
    		for(j=1;j<3;j++)
    		{
    			if(b[i-1][j-1]<0)
    			{
    				if(b[i-1][j]>=0&&b[i][j-1]>=0)
    				{
    					if(b[i][j-1]>=b[i-1][j])
    					{
    						b[i][j]=b[i][j-1]+a[i][j];
    					}
    					else
    					{
    						b[i][j]=b[i-1][j]+a[i][j];
    					}
    				}
    				else if(b[i-1][j]>=0&&b[i][j-1]<=0)
    				{
    					b[i][j]=b[i-1][j]+a[i][j];
    				}
    				else if(b[i-1][j]<=0&&b[i][j-1]>=0)
    				{
    					b[i][j]=b[i][j-1]+a[i][j];
    				}
    				else
    				{
    					b[i][j]=a[i][j];
    				}
    			}
    			else
    			{
    				if(b[i-1][j]>=0&&b[i][j-1]>=0)
    				{
    					b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
    				}
    				else if(b[i-1][j]>=0&&b[i][j-1]<=0)
    				{
    					b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
    				}
    				else if(b[i-1][j]<=0&&b[i][j-1]>=0)
    				{
    					b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
    				}
    				else
    				{
    					b[i][j]=a[i][j];
    				}
    			}
    		}
    	}
    	for(i=0;i<3;i++)
    	{
    		for(j=0;j<3;j++)
    		{
    			cout<<b[i][j]<<" ";
    		}
    		cout<<endl;
    	}
    	for(i=0;i<3;i++)
    	{
    		for(j=0;j<3;j++)
    		{
    			if(b[i][j]>max)
    				max=b[i][j];
    		}
    	}
    	cout<<"max="<<max<<endl;
    	return 0;		
    }
    

    完成者: 信1205 李志岩

                信1205 张新宇

  • 相关阅读:
    Java之JDBC操作
    Ubuntu17安装MySql5.7
    应用解决告诉你什么时候该用ajax
    jquery插件大全
    面试题:谈谈如何优化MYSQL数据库查询
    1亿条数据在PHP中实现Mysql数据库分表100张
    DEDECMS教程:首页实现分页的两种方法
    Dedecms当前位置{dede:field name='position'/}修改,去掉>方法
    mysql的MyISAM 和 InnoDB 的区别?优化MYSQL数据库的方法?
    COOKIE和SESSION关系和区别等
  • 原文地址:https://www.cnblogs.com/lizhiyan-world/p/3624817.html
Copyright © 2020-2023  润新知