二维数组的最大联通子图和

一、实验题目

  二维数组的最大联通子图和

二、实验思想

  1、先在主函数内输入行数和列数,然后利用for循环进行对二维数组的赋值。

  2、调用求最大值的函数求二维数组的联通最大值。

  3、其中当列数为1时,需要另外考虑,当成一维的计算,其它的情况利用先求每行的最大和最小块,然后进行最后的求总的最大值,然后返回进行输出最大值。

三、实验代码

import java.util.Scanner;

import javax.print.attribute.standard.PrinterLocation;

public class Maxshuzu
{
    public static void main(String[] args)
    {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入二维数组的行和列:");
        int hang=scanner.nextInt();
        int lie=scanner.nextInt();
        
        int[][] shuzu=new int[hang][lie];
        
        int i,j;
        for(i=0;i<hang;i++)
        {
            for(j=0;j<lie;j++)
            {
                shuzu[i][j]=scanner.nextInt();
            }
        }
        
        System.out.println("此数组中连续和的最大值为:"+max(shuzu,hang,lie));
    
    }
    
    static int max(int shuzu[][],int hang,int lie)
    {
        int max=0,sum=0;
        int i,j;
        int[] b=new int[lie];
        int[] up=new int[hang];
        int[] down=new int[hang];
        int[] t=new int[hang];
        if(lie==1)
        {
            for (i=0;i<hang;i++)
            {
                sum+=shuzu[i][0];
                if(sum<0)
                {
                    sum=0;
                }
                if(sum>max)
                {
                    max=sum;
                }
            }

           if(max==0)
           {
               for(i=0;i<hang;i++)
               {
                   if(i==0)
                   {
                       max=shuzu[i][0];
                   }
                   if(shuzu[i][0]>max)
                   {
                       max=shuzu[i][0];
                   }
               }
            }
        }
        else
        {
            for(i=0;i<hang;i++)
            {
                for(j=0;j<lie;j++)
                {
                    b[j]=shuzu[i][j];
                }
                int[] c=new int[100];
                c[0]=0;
                int sum1=0,max1=0,k;
                for(k=0;k<lie;k++)
                {
                    if(sum1<0)
                    {
                        sum1=b[k];
                    }
                    else
                    {
                        sum1=sum1+b[k];
                    }
                    c[k]=sum1;
                }
                max1=c[0];
                int mmark=0,smark=0;
                for(k=0;k<lie;k++)
                {
                    if (max1<c[k])
                    {
                        max1= c[k];
                        mmark = k;
                    }
                }
                for (k = mmark;k >= 0;k--)
                {
                    if (c[k] == b[k])
                    {
                        smark = k;
                        break;
                    }
                }
                sum=max1;
                
                up[i]=smark;                                  
                down[i]=mmark;
                t[i]=sum;
    
            }
            int t2=t[0];
            for(i=0;i<hang-1;i++)
            {
                if(up[i]<=down[i+1] && down[i]>=up[i+1])
                {
                    t2+=t[i+1];
                }
                for(j=up[i];j<up[i+1];j++)
                {
                    if(shuzu[i+1][j]>0) t2+=shuzu[i+1][j];                   //判别独立正数
                }
    
            }
            max=t2;
        }
        return max;
    }
}

四、实验截图

 

转载于:https://www.cnblogs.com/lizhaoxuan/p/6690343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值