《返回一个二维整数数组中最大联通子数组的和》

本文介绍了一种求解二维整数数组中最大联通子数组和的算法,通过将二维数组分解为多个一维数组,分别求取并比较各一维数组的最大连续子数组之和,最终找到位置相连且和最大的子数组。

                                                                           《返回一个二维整数数组中最大联通子数组的和》

设计思想:(1)首先把这个二维数组按行的数目分解为与列数目具有相同数目的一维数组;

(2)再分别求出这几个一维数组的最大连续子数组之和,分别记录每一个最大连续数组的首末位置;

(3)接着分别比较看这几个一维数组的首末位置是否处于矩阵上相连的位置,找出位置上相连且之和为最大的数组,输出它们的和即可。

源代码:

#include<iostream>

using namespace std;


int Max(int n,int a[],int *smark,int *mmark)

{

    int b[100]={0};

    int i,sum1=0,max1=0;

    for(i=0;i<n;i++)

    {

        if(sum1<0)

        {

            sum1=a[i];

        }

        else

        {

            sum1=sum1+a[i];

        }

        b[i]=sum1;

    }

    max1=b[0];

    for(i=0;i<n;i++)

    {

        if (max1<b[i]) 

         {

             max1= b[i];

             *mmark = i;

         }

    }

     for (i = *mmark;i >= 0;i--) 

    {

        if (b[i] == a[i]) 

        {

             *smark = i;

             break;

        }

    }

     return max1;

}

 

void main()

{

    int m,n,i,j,smark,mmark,t2;

    int sum;

    int up[100],down[100],t[100];

    int a[100][100],b[100];

    cout<<"请输入二维数组的行数和列数:";

    cin>>m>>n;
    cout<<"请输入这个二维矩阵:"<<endl;
    for(i=0;i<m;i++)

    {

        for(j=0;j<n;j++)

        {

            cin>>a[i][j];

        }

    }

    //把二维数组按行分解为几个一维数组
    for(i=0;i<m;i++)

    {

        for(j=0;j<n;j++)

        {

            b[j]=a[i][j];

        }

        sum=Max(n,b,&smark,&mmark);

        up[i]=smark;                                    

        down[i]=mmark;

        t[i]=sum;

 

    }

    t2=t[0];

    for(i=0;i+1<m;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(a[i+1][j]>0) t2+=a[i+1][j];                   //判别独立正数

        }

 

    }

     cout<<t2<<endl;

 

}

实验结果截图:

编程总结:虽然理解了题目的要求,也明白了输入了什么之后应该得到什么结果,但是在设计算法是还是遇到了一定的困难,老是在进入死胡同后就找不到了解决的方法了,由此写这个程序拖了很久很久,再后来在借鉴了别人的思想以及同学的帮助下还是基本上完成了任务,所以我觉得我之所以没有很好的解决思路和方法就是因为平时练得太少了,思维停滞了,因此多练,多看,多查相关资料,多借鉴好的思想是我今后需要逐步深入的!

转载于:https://www.cnblogs.com/Twinklelittlestar/p/4572617.html

任务描述 本关任务:通过定义的三个数组,对手机号进行识别。 相关知识 为了完成本关任务,你需要掌握:1.数组操作,2.if判断语句,3.方法结构。 定义数组 什么是数组 数组是为了存储固定大小的同类型元素的集合 数组声明 定义一个存储String类型,包含三个元素的数组 var z:Array[String] = new Array[String](3) //不隐藏数据类型 var z = new Array[String](3) //隐藏数据类型 定义一个存储String类型,包含"Java", "Python", "Scala"三个元素的数组 var z = Array("Java", "Python", "Scala") 多维数组 定义了一个整型的二维数组,其中包含3个一维数组,每个一维数组可以存储5个整数 var myScala = ofDim[Int](3,5) 注意:多维数组修饰符ofDim,单维数组修饰符是Array 数组基本操作方法 基本操作(操作数组arr) 描述 arr.length 返回数组的长度 arr.head 查看数组第一个元素 arr.tail 查看数组中除了第一个元素外的其他元素 arr.isEmpty 判断数组是否为空 arr.contains(x) 判断数组是否包含元素x if判断语句 if语句的语法格式如下: if(布尔表达式) { // 如果布尔表达式为 true 则执行该语句块 } if...else的语法格式如下: if(布尔表达式){ // 如果布尔表达式为 true 则执行该语句块 }else{ // 如果布尔表达式为 false 则执行该语句块 } if...else if...else语法格式如下: if(布尔表达式 1){ // 如果布尔表达式 1 为 true 则执行该语句块 }else if(布尔表达式 2){ // 如果布尔表达式 2 为 true 则执行该语句块 }else if(布尔表达式 3){ // 如果布尔表达式 3 为 true 则执行该语句块 }else { // 如果以上条件都为 false 执行该语句块 } 方法结构 方法声明格式: def 方法名(参数名1:参数类型1, 参数名2:参数类型2,...) : 返回类型 定义一个方法名为myScala,第一个参数名为a,类型为 Int,第二参数为b,类型为 String,返回类型为 Int 的方法: def myScala( a:Int, b:String ) : Int = { return 0 } 当方法没有返回值,则返回类型使用 Unit,或者隐藏返回类型: def myScala( a:Int, b:String ) : Unit = { print(a) } def myScala( a:Int, b:String ) { print(a) } 编程要求 已知移动号码数组:yidong var yidong = Array(135, 136, 137, 138, 139, 150, 151, 152, 157, 158, 159, 182, 183, 184, 187, 188, 178, 147, 1705); 已知联通号码数组:liantong var liantong = Array(130, 131, 132, 155, 156, 185, 186, 176, 145) 已知电信号码数组:dianxin var dianxin = Array(133, 153, 180, 181, 189, 177) 根据提示,在右侧编辑器补充代码,完成手机号码识别: 当为移动号码时输出:这个号码属于中国移动类型的 当为联通号码时输出:这个号码属于中国联通类型的 当为电信号码时输出:这个号码属于中国电信类型的 当都不匹配时输出:这个号码不属于中国号码 ackage step object step3 { //移动 var yidong = Array(135, 136, 137, 138, 139, 150, 151, 152, 157, 158, 159, 182, 183, 184, 187, 188, 178, 147, 1705); //联通 var liantong = Array(130, 131, 132, 155, 156, 185, 186, 176, 145) //电信 var dianxin = Array(133, 153, 180, 181, 189, 177) def identify(x: Int) { /********** Begin *********/ /********** End *********/ } }
06-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值